时间处理函数
一、UNIX时间戳
以32位整数表示格林威治标准时间 11230499325
常用的函数 mktime,time,strtotime
1、int mktime ([ int $hour [, int $minute [, int $second [, int $month [, int $day [, int $year [, int $is_dst ]]]]]]] )
u 根据给出的参数返回 Unix 时间戳。时间戳是一个长整数,包含了从 Unix 纪元(January 1 1970 00:00:00 GMT)到给定时间的秒数。
u 参数可以从右向左省略,任何省略的参数会被设置成本地日期和时间的当前值。
注意:
I.month是在date前面的,不要弄错了位置。
II.其中$year的合法范围是 1901 到 2038 之间,不过此限制自 PHP 5.1.0 起已被克服了
III.自 PHP 5.1.0 起,$is_dst参数已被废弃。应该使用新的时区处理特性来替代。出错时函数返回 FALSE 而不再是 -1。修正了本函数可以接受年月日参数全为零。
Example:
I.mktime()在做日期计算和验证方面很有用,它会自动计算超出范围的输入的正确值。例如下面例子中每一行都会产生字符串 "Jan-01-1998"。
<?php
echo date("M-d-Y", mktime(0, 0, 0, 12, 32, 1997));
echo date("M-d-Y", mktime(0, 0, 0, 13, 1, 1997));
echo date("M-d-Y", mktime(0, 0, 0, 1, 1, 1998));
echo date("M-d-Y", mktime(0, 0, 0, 1, 1, 98));
?>
II.任何给定月份的最后一天都可以被表示为下个月的第 "0" 天,而不是 -1 天。下面两个例子都会产生字符串 "The last day in Feb 2000 is: 29"。
<?php
$lastday = mktime(0, 0, 0, 3, 0, 2000);
echo strftime("Last day in Feb 2000 is: %d", $lastday);
$lastday = mktime(0, 0, 0, 4, -31, 2000);
echo strftime("Last day in Feb 2000 is: %d", $lastday);
?>
III.我的应用日期计算每个月加9,日期加7
date("Y-m-d", mktime("0","0","0",$month+9,$date+7,"$year"));
2、int time ( void )
自 PHP 5.1 起在 $_SERVER['REQUEST_TIME'] 中保存了发起该请求时刻的时间戳。
Example:
<?php
$nextWeek = time() + (7 * 24 * 60 * 60);
// 7 days; 24 hours; 60 mins; 60secs
echo 'Now: '. date('Y-m-d') ."\n";
echo 'Next Week: '. date('Y-m-d', $nextWeek) ."\n";
?>
以上例程的输出类似于:
Now: 2005-03-30
Next Week: 2005-04-07
3、int strtotime ( string $time [, int $now ] )
本函数预期接受一个包含美国英语日期格式的字符串并尝试将其解析为 Unix 时间戳(自 January 1 1970 00:00:00 GMT 起的秒数),其值相对于 now 参数给出的时间,如果没有提供此参数则用系统当前时间。
Note:
如果给定的年份是两位数字的格式,则其值 0-69 表示 2000-2069,70-100 表示 1970-2000。
Example:
<?php
echo strtotime("now"), "\n";
echo strtotime("10 September 2000"), "\n";
echo strtotime("+1 day"), "\n";
echo strtotime("+1 week"), "\n";
echo strtotime("+1 week 2 days 4 hours 2 seconds"), "\n";
echo strtotime("next Thursday"), "\n";
echo strtotime("last Monday"), "\n";
?>
二、日期和时间格式化输出
将时间戳的格式转了 我们可以读懂的时间格式
或者直接输出我们可以读懂的时间格式
date, strftime, getdate
1、 string date ( string $format [, int $timestamp ] )
返回将整数 timestamp 按照给定的格式字串而产生的字符串。如果没有给出时间戳则使用本地当前时间。换句话说,timestamp 是可选的,默认值为 time()
1. 年-月-日
echo date('Y-m-j'); //例:2007-02-6
echo date('y-n-j'); //例:07-2-6
大写Y表示年四位数字,而小写y表示年的两位数字;
小写m表示月份的数字(带前导),而小写n则表示不带前导的月份数字。
echo date('Y-M-j'); //例:2007-Feb-6
echo date('Y-m-d'); //例:2007-02-06
大写M表示月份的3个缩写字符,而小写m则表示月份的数字(带前导0);
没有大写的J,只有小写j表示月份的日期,无前导o;若需要月份带前导则使用小写d。
echo date('Y-M-j'); //例:2007-Feb-6
echo date('Y-F-jS'); //例:2007-February-6
大写M表示月份的3个缩写字符,而大写F表示月份的英文全写。(没有小写f)
大写S表示日期的后缀,比如“st”、“nd”、“rd”和“th”,具体看日期数字为何。
小结:
表示年可以用大写的Y和小写y;
表示月可以用大写F、大写M、小写m和小写n(分别表示字符和数字的两种方式);
表示日可以用小写d和小写j,大写S表示日期的后缀。
2,时:分:秒
默认情况下,PHP解释显示的时间为“格林威治标准时间”,与我们本地的时间相差8个小时。
echo date('g:i:s a'); //例:5:56:57 am
echo date('h:i:s A'); //例:05:56:57 AM
小写g表示12小时制,无前导0,而小写h则表示有前导0的12小时制。
当使用12小时制时需要表明上下午,小写a表示小写的“am”和“pm”,大写A表示大写的“AM”和“PM”。
echo date('G:i:s');14:02:26
大写G表示24小时制的小时数,但是不带前导的;使用大写的H表示带前导的24小时制小时数
小结:
字母g表示小时不带前导,字母h表示小时带前导;
小写g、h表示12小时制,大写G、H表示24小时制。
3,闰年、星期、天
大写L表示判断今年是否闰年,布尔值,为真返回1,否则为0;
小写l表示当天是星期几的英文全写(Tuesday);
而使用大写D表示星期几的3个字符缩写(Tue)。
echo date('w'); //例:今天星期:2
echo date('W'); //例:本周是全年中的第 06 周
小写w表示星期几,数字形式表示
大写W表示一年中的星期数
echo date('t'); //例:本月是 28 天
echo date('z'); //例:今天是今年的第 36 天
小写t表示当前月份又多少天
小写z表示今天是本年中第几天
4,其他
echo date('T'); //例:UTC
大写T表示服务器的时间区域设置
echo date('I'); //例:0
大写I表示判断当前是否为夏令时,为真返回1,否则为0
echo date('U'); //例:1170769424
大写U表示从1970年1月1日到现在的总秒数,就是Unix时间纪元的UNIX时间戳
echo date('c'); //例:2007-02-06T14:24:43+00:00
小写c表示ISO8601日期,日期格式为YYYY-MM-DD,用字母T来间隔日期和时间,时间格式为HH:MM:SS,时区使用格林威治标准时间(GMT)的偏差来表示。
echo date('r'); //例:Tue, 06 Feb 2007 14:25:52 +0000
小写r表示RFC822日期。
5,Example date() 和 mktime() 例子
<?php
$tomorrow = mktime(0, 0, 0, date("m") , date("d")+1, date("Y"));
$lastmonth = mktime(0, 0, 0, date("m")-1, date("d"), date("Y"));
$nextyear = mktime(0, 0, 0, date("m"), date("d"), date("Y")+1);
?>
Note:
由于夏令时的缘故,这种方法比简单地在时间戳上加减一天或者一个月的秒数更可靠。
date()和strtime()的例子
<?php
$time=strtotime($date);
$data['month0']=date('Y年m月d日',$time);
$data['month1']=date('Y年m月d日',strtotime('+1 month',$time));
?>
2、 string strftime ( string $format [, int $timestamp ] )
返回用给定的格式字串对给出的 timestamp 进行格式输出后的字符串。如果没有给出时间戳则用当前的本地时间。月份和星期几以及其它和语言有关的字符串写法和用 setlocale() 设定的当前的区域有关。
格式字串能识别下列转换标记:
- %a - 当前区域星期几的简写
- %A - 当前区域星期几的全称
- …………………………..
3、 array getdate ([ int $timestamp ] )
返回一个根据 timestamp 得出的包含有日期信息的结合数组。如果没有给出时间戳则认为是当前本地时间。数组中的单元如下:
Example getdate() 例子
<?php
$today = getdate();
print_r($today);
?>
以上例程的输出类似于:
Array
(
[seconds] => 40
[minutes] => 58
[hours] => 21
[mday] => 17
[wday] => 2
[mon] => 6
[year] => 2003
[yday] => 167
[weekday] => Tuesday
[month] => June
[0] => 1055901520
)
三、系统时区设置
很多同学在学习过程中发现通过date()函数获取到的时间跟本地时间不一样,这是由于PHP5对date()函数进行了重写,因此,目前的日期时间函数比系统时间少8个小时。在PHP语言中默认设置的是标准的格林威治时间(即采用的是零时区)。
更改PHP语言中的时区设置主要有以下两种方法:
1. 修改php.ini文件中的设置,找到[date]下的;date.timezone = 选项,将该项修改为date.timezone=Asia/Hong_Kong,然后重新启动apache服务器。
2. 在应用程序中,使用时间日期函数之前添加如下函数:
date_default_timezone_set(“Asia/Hong_Kong”);
设置完成后,date()函数就可以正常使用了,不会再出现时差问题。
四、时间开发中遇到的日期和时间问题
1、比较两个时间的大小
在实际开发中经常遇到判断两个时间的大小,PHP中的时间是不可以直接来进行比较的。所以,首先要将时间输出为时间戳的格式,然后再进行比较,这是常用到的方法。
有两个函数strtotime()和mktime()都可以实现这个功能,这里先使用strtotime()函数,
例1:
<?php $time1 = date("Y-m-d H:i:s"); //获取当前时间 $time2 = "2008-2-3 16:30:00"; //给变量$time2设置一个时间 echo "变量/$time1的时间为:".$time1."<br>"; //输出两个时间变量 echo "变量/$time2的时间为:".$time2."<br>"; if (strtotime($time1)-strtotime($time2)<0) { //对两个时间进行比较 echo "/$time1早于/$time2"; //如果time1-time2<0说明time1的时间在前 }else{ echo "/$time2早于/$time1"; //否则,说明time2的时间在前 } ?> |
2、计算两个日期的差值
strtotime()函数除了可以比较两个日期的大小,还可以精确地知道两个日期的差值。下面通过一个倒计时的小程序来为学员们讲解如何用strtotime()函数来计算两个日期的差值。
<?PHP $time1 = strtotime(date( "Y-m-d H:i:s")); $time2 = strtotime("2008-2-3 17:10:00"); $time3 = strtotime("2008-8-8"); $sub1 = ceil(($time2 - $time1) / 3600); //60 * 60 $sub2 = ceil(($time3 - $time1) / 86400); //60 * 60 * 24 echo "离放假还有<font color=red> $sub1 </font>小时!!!" ; echo "<p>"; echo "离北京奥运开幕还有<font color=red>$sub2 </font>天!!!"; ?> |
还可以用mktime()函数来实现
<?php
$startdate = mktime("0","0","0","$month","$date","$year");
$enddate = mktime();
$week=round(($enddate-$startdate)/3600/24/7);
$data ['week'] =$week;
?>
注意:ceil和round的区别。
ceil返回不小于 value 的下一个整数,value 如果有小数部分则进一位。ceil() 返回的类型仍然是 float。1.echo ceil(4.3); // 5 2.echo ceil(9.999); // 10
round返回将 val 根据指定精度 precision(十进制小数点后数字的数目)进行四舍五入的结果
echo round(3.4); // 3
echo round(3.5); // 4
echo round(3.6); // 4
echo round(3.6, 0); // 4
echo round(1.95583, 2); // 1.96
echo round(1241757, -3); // 1242000
echo round(5.045, 2); // 5.05
echo round(5.055, 2); // 5.06
3、计算页面脚本的运行时间
在浏览网站时,经常会用到搜索引擎,在搜索信息时,细心的用户会发现,在搜索结果的最下方,一般都有“搜索时间为……秒”的字样。
这里使用到了microtime()函数,该函数返回当前UNIX时间戳和微秒数。返回格式为msec sec的字符串,其中sec是当前的UNIX时间戳,msec为微秒数。该函数的格式为:
string microtime(void)
下面我们来计算一下上例的运行时间,代码如下:
<?php
function run_time()
{
list($msec, $sec) = explode(" ", microtime());
return ((float)$msec + (float)$sec);
}
$start_time = run_time();
$time1 = strtotime(date( "Y-m-d H:i:s"));
$time2 = strtotime("2008-2-3 17:10:00");
$time3 = strtotime("2008-8-8");
$sub1 = ceil(($time2 - $time1) / 3600); //60 * 60
$sub2 = ceil(($time3 - $time1) / 86400); //60 * 60 * 24
echo "离放假还有<font color=red> $sub1 </font>小时!!!" ;
echo "<p>";
echo "离北京奥运开幕还有<font color=red>$sub2 </font>天!!!";
$end_time = run_time();
?>
该示例的运行时间为<font color=blue> <?php echo ($end_time - $start_time); ?> </font>秒
4、 输出日历Calendar
日历类可以让你动态创建日历.并且用日历模板对创建的日历格式化,100%的控制它的样式.另外,你可以传送数据到你的日历单元格中(比如创建一个链接).
<?php
class Calendar {
private $year; //当前的年
private $month; //当前的月
private $start_weekday; //当月的第一天对应的是周几
private $days; //当前月一共多少天
function __construct(){
$this->year=isset($_GET["year"]) ? $_GET["year"] : date("Y");
$this->month=isset($_GET["month"]) ? $_GET["month"] : date("m");
$this->start_weekday=date("w", mktime(0, 0, 0, $this->month, 1, $this->year));
$this->days=date("t", mktime(0, 0, 0, $this->month, 1, $this->year));
}
function out(){
echo '<table align="center">';
$this->chageDate("test.php");
$this->weeksList();
$this->daysList();
echo '</table>';
}
private function weeksList(){
$week=array('日','一','二','三','四','五','六');
echo '<tr>';
for($i=0; $i<count($week); $i++)
echo '<th class="fontb">'.$week[$i].'</th>';
echo '</tr>';
}
private function daysList(){
echo '<tr>';
//输出空格(当前一月第一天前面要空出来)
for($j=0; $j<$this->start_weekday; $j++)
echo '<td> </td>';
for($k=1; $k<=$this->days; $k++){
$j++;
if($k==date('d'))
echo '<td class="fontb">'.$k.'</td>';
else
echo '<td>'.$k.'</td>';
if($j%7==0)
echo '</tr><tr>';
}
//后面几个空格
while($j%7!==0){
echo '<td> </td>';
$j++;
}
echo '</tr>';
}
private function prevYear($year, $month){
$year=$year-1;
if($year < 1970)
$year = 1970;
return "year={$year}&month={$month}";
}
private function prevMonth($year, $month){
if($month == 1) {
$year = $year -1;
if($year < 1970)
$year = 1970;
$month=12;
}else{
$month--;
}
return "year={$year}&month={$month}";
}
private function nextYear($year, $month){
$year = $year + 1;
if($year > 2038)
$year = 2038;
return "year={$year}&month={$month}";
}
private function nextMonth($year, $month){
if($month==12){
$year++;
if($year > 2038)
$year=2038;
$month=1;
}else{
$month++;
}
return "year={$year}&month={$month}";
}
private function chageDate($url=""){
echo '<tr>';
echo '<td><a href="?'.$this->prevYear($this->year, $this->month).'">'.'<<'.'</a></td>';
echo '<td><a href="?'.$this->prevMonth($this->year, $this->month).'">'.'<'.'</a></td>';
echo '<td colspan="3">';
echo '<form>';
echo '<select name="year" onchange="window.location=\''.$url.'?year=\'+this.options[selectedIndex].value+\'&month='.$this->month.'\'">';
for($sy=1970; $sy <= 2038; $sy++){
$selected = ($sy==$this->year) ? "selected" : "";
echo '<option '.$selected.' value="'.$sy.'">'.$sy.'</option>';
}
echo '</select>';
echo '<select name="month" onchange="window.location=\''.$url.'?year='.$this->year.'&month=\'+this.options[selectedIndex].value">';
for($sm=1; $sm<=12; $sm++){
$selected1 = ($sm==$this->month) ? "selected" : "";
echo '<option '.$selected1.' value="'.$sm.'">'.$sm.'</option>';
}
echo '</select>';
echo '</form>';
echo '</td>';
echo '<td><a href="?'.$this->nextYear($this->year, $this->month).'">'.'>>'.'</a></td>';
echo '<td><a href="?'.$this->nextMonth($this->year, $this->month).'">'.'>'.'</a></td>';
echo '</tr>';
}
}