首页 > 代码库 > php时间函数
php时间函数
实例讲解之前,先来介绍几个核心函数:
mktime 函数
mktime() 函数返回一个日期的 Unix 时间戳。
参数总是表示 GMT 日期,因此 is_dst 对结果没有影响。
参数可以从右到左依次空着,空着的参数会被设为相应的当前 GMT 值。
语法:mktime(hour,minute,second,month,day,year,is_dst)
参数 描述
hour 可选。规定小时。
minute 可选。规定分钟。
second 可选。规定秒。
month 可选。规定用数字表示的月。
day 可选。规定天。
year 可选。规定年。在某些系统上,合法值介于 1901 - 2038 之间。不过在 PHP 5 中已经不存在这个限制了。
is_dst 可选。如果时间在日光节约时间(DST)期间,则设置为1,否则设置为0,若未知,则设置为-1。
自 5.1.0 起,is_dst 参数被废弃。因此应该使用新的时区处理特性。
例子:mktime() 函数对于日期运算和验证非常有用。它可以自动校正越界的输入:
1
2
3
4
5
6
|
<?php echo ( date ( "M-d-Y" , mktime (0,0,0,12,36,2001))); echo ( date ( "M-d-Y" , mktime (0,0,0,14,1,2001))); echo ( date ( "M-d-Y" , mktime (0,0,0,1,1,2001))); echo ( date ( "M-d-Y" , mktime (0,0,0,1,1,99))); ?> |
输出:
1
2
3
4
|
Jan-05-2002 Feb-01-2002 Jan-01-2001 Jan-01-1999 |
strtotime 函数
strtotime() 函数将任何英文文本的日期时间描述解析为 Unix 时间戳。
语法:strtotime(time,now)
参数 描述
time 规定要解析的时间字符串。
now 用来计算返回值的时间戳。如果省略该参数,则使用当前时间。
一周之后: strtotime("+1 week") ;
一周之前: strtotime("-1 week") ;
一月之后: strtotime("+1 months") ;
一天之后: strtotime("+1 days") ;
30秒之后 strtotime( " +30 seconds " );
20分钟之后 strtotime( " +20 minutes " );
12个小时之后 strtotime( " +12 hours " );
date 函数
date() 函数格式化一个本地时间/日期。
语法
date(format,timestamp)
date_default_timezone_set 函数
date_default_timezone_set() 函数设置用在脚本中所有日期/时间函数的默认时区。
date_default_timezone_set(timezone)
实例
第一种情况是没有数据库,只是得到的日期值进行比较的话,那就得完全用php的时间日期函数计算了,如下:
比如要计算2015-9-5到2015-9-18还有多少天:
1
2
3
4
5
6
|
<?php $startdate = strtotime ( "2015-9-5" ); $enddate = strtotime ( "2015-9-18" ); //上面的php时间日期函数已经把日期变成了时间戳,就是变成了秒。这样只要让两数值相减,然后把秒变成天就可以了,比较的简单,如下: $days = round (( $enddate - $startdate )/3600/24) ; echo $days ; //days为得到的天数; ?> |
第二种
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
<? date_default_timezone_set( ‘Asia/Shanghai‘ ); //以上一句为设置时区,其实不设也行,但是zde debug的时候会有提示,说什么不安全的函数…添上吧。 echo date ( ‘Y-m-d H:i:s‘ ). ‘ 今天是‘ . date ( ‘Y‘ ). ‘年的第‘ . date ( ‘W‘ ). ‘周‘ ; $stime = ‘2005-11-03 10:08‘ ; echo "<br/><br/>***自出生(<font color=blue>$stime</font>)以来…:<br/><br/>" ; echo "今天是第<font color=red><b>" .Lnbsp(daysofnow( $stime ),3). "</b></font>天<br/>" ; echo "今天是第<font color=red><b>" .Lnbsp(weeksofnow( $stime ),3). "</b></font>周<br/>" ; echo "今天是第<font color=red><b>" .Lnbsp(monthsofnow( $stime ),3). "</b></font>个月<br/>" ; echo "今天是第<font color=red><b>" .Lnbsp(yearsofnow( $stime ),3). "</b></font>年<br/>" ; /* $output=sprintf(" 今天是第<font color=red><b>%03d</b></font>天<br/>今天是第< font color=red><b>%03d</b></font>周<br/>今天是第< font color=red><b>%03d</b></font>个月<br/>今天是第< font color=red><b>%03d</b></font>年<br/& gt;",daysofnow($stime),weeksofnow($stime),monthsofnow($stime),yearsofnow($stime)); echo $output; */ function weeksofnow( $stime ) { $ftime = strtotime ( $stime ); $fweeks = date ( ‘w‘ , $ftime ); if ( $fweeks ==0) $fweeks =7; $nweeks = date ( ‘w‘ ); if ( $nweeks ==0) $nweeks =7; $ftemp = strtotime ( date ( ‘Y-m-d 00:00:00‘ , $ftime ))- $fweeks *60*60*24; $ntemp = strtotime ( date ( ‘Y-m-d 00:00:00‘ ,time()))+(7- $nweeks )*60*60*24; //echo date(‘w‘,$ftemp)."<br/>....<br/>".date(‘w‘,$ntemp)."<br/>"; return ( $ntemp - $ftemp )/60/60/24/7; } function daysofnow( $stime ) { $ftime = strtotime ( $stime ); return ceil ( abs ((time()- $ftime )/(60*60*24))); } function monthsofnow( $stime ) { $ftime = strtotime ( $stime ); $fmonth = date ( ‘m‘ , $ftime ); $fyear = date ( ‘Y‘ , $ftime ); $nmonth = date ( ‘m‘ ); $nyear = date ( ‘Y‘ ); $result =( $nyear - $fyear )*12+ $nmonth - $fmonth +1; return $result ; } function yearsofnow( $stime ) { $ftime = strtotime ( $stime ); $fyear = date ( ‘Y‘ , $ftime ); $nyear = date ( ‘Y‘ ); return $nyear - $fyear +1; } // 下面的函数只是加空格用的,不是核心内容,只为美观 function Lnbsp( $data , $num ) { $result =trim( $data ); for ( $i = $num ; $i >= strlen ( $data ); $i --) { $result = ‘ ‘ . $result ; } return $result ; } ?> |
第三种 情况:明天,下个月和明年的日期,就可以用以下的代码:
1
2
3
4
5
6
7
|
$tomorrow = date ( ‘Y-m-d‘ , mktime (0,0,0, date ( "m" ), date ( "d" )+1, date ( "Y" ))); $nextmonth = date ( ‘Y-m‘ , mktime (0,0,0, date ( "m" )+1, date ( "d" )+1, date ( "Y" ))); $nextyear = date ( ‘Y‘ , mktime (0,0,0, date ( "m" ), date ( "d" ), date ( "Y" )+1)); echo $tomorrow . ‘<br/>‘ ; echo $nextmonth . ‘<br/>‘ ; echo $nextyear . ‘<br/>‘ ; |
第四种情况:工作时间(刨除假日)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
<? $startDate = "2001-12-12" ; $endDate = "2002-11-1" ; $holidayArr = array ( "05-01" , "05-02" , "10-01" , "10-01" , "10-02" , "10-03" , "10-04" , "10-05" , "01-26" , "01-27" , "01-28" , "01-29" ); //假期日期数组,比方国庆,五一,春节等 $endWeek =2; //周末是否双休.双休为2,仅仅星期天休息为1,没有休息为0 $beginUX = strtotime ( $startDate ); $endUX = strtotime ( $endDate ); for ( $n = $beginUX ; $n <= $endUX ; $n = $n +86400){ $week = date ( "w" , $n ); $MonDay = date ( "m-d" , $n ); if ( $endWeek ){ //去处周末休息 if ( $endWeek ==2){ if ( $week ==0|| $week ==6) continue ; } if ( $endWeek ==1){ if ( $week ==0) continue ; } } if (in_array( $MonDay , $holidayArr )) continue ; $totalHour +=10; //每天工作10小时 } echo "开始日期:$startDate<BR>" ; echo "结束日期:$endDate<BR>" ; echo "共花了" . $totalHour . "小时" ; ?> |
第五种情况:给出秒算小时
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
<?php function transform( $sec ){ $output = ‘‘ ; $hours = floor ( $sec / 3600); $remainSeconds = $sec % 3600; $minutes = floor ( $remainSeconds / 60); $seconds = $sec - $hours * 3600 - $minutes * 60; if ( $sec >= 3600){ $output .= $hours . ‘ h / ‘ ; $output .= $minutes . ‘ m / ‘ ; } if ( $sec >= 60 && $sec < 3600){ $output .= $minutes . ‘ m / ‘ ; } return $output .= $seconds . ‘ s ‘ ; } echo transform(3231803); ?> |
php时间函数