PHP日期时间用法大全

PHP日期时间用法大全

1.一般在PHP初始化文件头部,首先要设置正确的时区,否则主机默认时区不对的话,造成PHP代码中用到的日期时间都不对。


  1. echo date_default_timezone_get();//获取主机默认时区

  2. date_default_timezone_set('Asia/Shanghai');//'Asia/Shanghai' 亚洲/上海   或者:

  3. date_default_timezone_set('PRC');//其中PRC为“*”




  1. date_default_timezone_set('Asia/Shanghai');

  2. $time=date("Y-m-d H:i:s");

  3. $time=StrToTime($time);

2.获取本地日期时间:


  1. echodate('Y:m:d h:i:s'); //2013:01:19 01:10:43

格式:string date ( string format [, int timestamp] )

还有一些格式:

format字符 说明 返回值例子
--- ---
d 月份中的第几天,有前导零的 2 位数字 01 到 31
D 星期中的第几天,文本表示,3 个字母 Mon 到 Sun
j 月份中的第几天,没有前导零 1 到 31
l(“L”的小写字母) 星期几,完整的文本格式 Sunday 到 Saturday
N ISO-8601 格式数字表示的星期中的第几天(PHP 5.1.0 新加) 1(表示星期一)到 7(表示星期天)
S 每月天数后面的英文后缀,2 个字符 st,nd,rd 或者 th。可以和 j 一起用
w 星期中的第几天,数字表示 0(表示星期天)到 6(表示星期六)
z 年份中的第几天 0 到 366
星期 --- ---
W ISO-8601 格式年份中的第几周,每周从星期一开始(PHP 4.1.0 新加的) 例如:42(当年的第 42 周)
--- ---
F 月份,完整的文本格式,例如 January 或者 March January 到 December
m 数字表示的月份,有前导零 01 到 12
M 三个字母缩写表示的月份 Jan 到 Dec
n 数字表示的月份,没有前导零 1 到 12
t 给定月份所应有的天数 28 到 31
--- ---
L 是否为闰年 如果是闰年为 1,否则为 0
o ISO-8601 格式年份数字。这和 Y 的值相同,只除了如果 ISO 的星期数(W)属于前一年或下一年,则用那一年。(PHP 5.1.0 新加) Examples: 1999 or 2003
Y 4 位数字完整表示的年份 例如:1999 或 2003
y 2 位数字表示的年份 例如:99 或 03
时间 --- ---
a 小写的上午和下午值 am 或 pm
A 大写的上午和下午值 AM 或 PM
B Swatch Internet 标准时 000 到 999
g 小时,12 小时格式,没有前导零 1 到 12
G 小时,24 小时格式,没有前导零 0 到 23
h 小时,12 小时格式,有前导零 01 到 12
H 小时,24 小时格式,有前导零 00 到 23
i 有前导零的分钟数 00 到 59>
s 秒数,有前导零 00 到 59>
时区 --- ---
e 时区标识(PHP 5.1.0 新加) 例如:UTC,GMT,Atlantic/Azores
I 是否为夏令时 如果是夏令时为 1,否则为 0
O 与格林威治时间相差的小时数 例如:+0200
T 本机所在的时区 例如:EST,MDT(【译者注】在 Windows 下为完整文本格式,例如“Eastern Standard Time”,中文版会显示“中国标准时间”)。
Z 时差偏移量的秒数。UTC 西边的时区偏移量总是负的,UTC 东边的时区偏移量总是正的。 -43200 到 43200
完整的日期/时间 --- ---
c ISO 8601 格式的日期(PHP 5 新加) 2004-02-12T15:19:21+00:00
r RFC 822 格式的日期 例如:Thu, 21 Dec 2000 16:01:07 +0200
U 从 Unix 纪元(January 1 1970 00:00:00 GMT)开始至今的秒数 参见 time()


2.getdate()这个函数返回一个关联数组:

Array
(
    [seconds] => 40
    [minutes] => 58
    [hours]   => 21
    [mday]    => 17
    [wday]    => 2
    [mon]     => 6
    [year]    => 2003
    [yday]    => 167
    [weekday] => Tuesday
    [month]   => June
    [0]       => 1055901520
)


3.idate ( string format [, int timestamp] ),format只接受一个字符:


format 字符 说明
B Swatch Beat/Internet Time
d 月份中的第几天
h 小时(12 小时格式)
H 小时(24 小时格式)
i 分钟
I 如果启用夏时制则返回 1,否则返回 0
L 如果是闰年则返回 1,否则返回 0
m 月份的数字
s 秒数
t 本月的总天数
U 自 Unix 纪元(January 1 1970 00:00:00 GMT)起的秒数――这和 time() 作用相同
w 星期中的第几天(星期天是 0)
W ISO-8601 格式年份中的第几个星期,每星期从星期一开始
y 年份(1 或 2 位数字――见下面说明)
Y 年份(4 位数字)
z 年份中的第几天
Z 以秒为单位的时区偏移量


4.localtime(time(), true); 返回一个关联数组,含义如下:


Array
(
    [tm_sec] => 24
    [tm_min] => 3
    [tm_hour] => 19
    [tm_mday] => 3
    [tm_mon] => 3
    [tm_year] => 105
    [tm_wday] => 0
    [tm_yday] => 92
    [tm_isdst] => 1
)
"tm_sec" - 秒数 
"tm_min" - 分钟数 
"tm_hour" - 小时 
"tm_mday" - 月份中的第几日 
"tm_mon" - 年份中的第几个月,从 0 开始表示一月 
"tm_year" - 年份,从 1900 开始 
"tm_wday" - 星期中的第几天 
"tm_yday" - 一年中的第几天 
"tm_isdst" - 夏令时当前是否生效 
注: 月份从 0(一月)到 11(十二月),星期数从 0(星期天)到 6(星期六)。


5.microtime -- 返回当前 Unix 时间戳和微秒数,返回格式:msec sec  

6.strftime -- 根据区域设置格式化本地时间/日期,这个参数比较多,详情见手册。经常和另一个函数同时出现:strptime -- 解析由 strftime() 生成的日期/时间


  1. $format = '%d/%m/%Y %H:%M:%S';

  2. $strf = strftime($format);


  3. echo"$strf\n";  //03/10/2004 15:54:19


6.mktime -- 取得一个日期的 Unix 时间戳

参数int hour , int minute , int second , int month , int day , int year

当你要表示某个月的最后一天,可以用下个月的第0天表示(也可以用负数):


  1. $lastday = mktime(0, 0, 0, 3, 0, 2000);

  2. echostrftime("Last day in Feb 2000 is: %d", $lastday);


7.time -- 返回当前的 Unix 时间戳

这个时间戳,一般我们作为参数,用作前面的函数,比如date()


  1. $nextWeek = time() + (7 * 24 * 60 * 60); // 7天

  2. echo'Next Week: '. date('Y-m-d', $nextWeek) ."\n";


二、时间日期转换

1、checkdate(month,day,year)函数验证指定的值合法性,该函数返回 true,否则返回 false。


  1. <?php  

  2. if(checkdate(4,31,2013)==true){//false

  3. echo 1;

  4. }

  5. else{

  6. echo 0;

  7. }

  8. if(checkdate(4,30,2013)==true){//true

  9. echo 1;

  10. }

  11. else{

  12. echo 0;

  13. }

  14. ?>  

2、日期转换成时间戳

$time=date("Y-m-d H:i:s");

$time=StrToTime($time);

3、时间戳转换成日期

$time="1366704555";

$time=date("Y-m-d H:i:s",$time);

4、获取指定日期


  1. <?php

  2. date_default_timezone_set('Asia/Shanghai');

  3. echo"今天:",date("Y-m-d",time()),"<br>";  

  4. echo"今天:",date("Y-m-d",strtotime("26 april 2013")),"<br>";  

  5. echo"昨天:",date("Y-m-d",strtotime("-1 day")), "<br>";  

  6. echo"明天:",date("Y-m-d",strtotime("+1 day")), "<br>";  

  7. echo"一周后:",date("Y-m-d",strtotime("+1 week")), "<br>";  

  8. echo"一周零两天四小时两秒后:",date("Y-m-d G:H:s",strtotime("+1 week 2 days 4 hours 2 seconds")), "<br>";  

  9. echo"下个星期四:",date("Y-m-d",strtotime("next Thursday")), "<br>";  

  10. echo"上个周一:".date("Y-m-d",strtotime("last Monday"))."<br>";  

  11. echo"一个月前:".date("Y-m-d",strtotime("last month"))."<br>";  

  12. echo"一个月后:".date("Y-m-d",strtotime("+1 month"))."<br>";  

  13. echo"十年后:".date("Y-m-d",strtotime("+10 year"))."<br>";  

  14. ?>

5、php获取微博(博文、动态)发表于多久时间前

另一方法:http://xuqin.blog.51cto.com/5183168/1264254


  1. <?php

  2. function maktimes($time){

  3. $t=time()-$time;

  4. $f=array(

  5. '31536000'=> '年',

  6. '2592000' => '个月',

  7. '604800'  => '星期',

  8. '86400'   => '天',

  9. '3600'    => '小时',

  10. '60'      => '分钟',

  11. '1'       => '秒'

  12.    );

  13. foreach ($fas$k=>$v){        

  14. if (0 !=$c=floor($t/(int)$k)){

  15. return'发表于'.$c.$v.'前';

  16.        }

  17.    }

  18. }

  19. /*

  20. date_default_timezone_set('Asia/Shanghai');

  21. $time=date("Y-m-d H:i:s");

  22. $time=StrToTime($time);

  23. */

  24. $time="1366939913";

  25. echo maktimes($time);

  26. ?>

6、php计算两日期剩余(间隔)时间天数



  1. <?php

  2. function format($a,$b){

  3. //检查两个日期大小,默认前小后大,如果前大后小则交换位置以保证前小后大

  4. if(strtotime($a)>strtotime($b)) list($a,$b)=array($b,$a);

  5. $start  = strtotime($a);

  6. $stop   = strtotime($b);

  7. $extend = ($stop-$start)/86400;

  8. $result['extends'] = $extend;   //共多少天

  9. if($extend<7){                //如果小于7天直接返回天数

  10. $result['daily'] = $extend;

  11.        }elseif($extend<=31){        //小于28天则返回周数,由于闰年2月满足了

  12. if($stop==strtotime($a.'+1 month')){

  13. $result['monthly'] = 1;

  14.            }else{

  15. $w = floor($extend/7);

  16. $d = ($stop-strtotime($a.'+'.$w.' week'))/86400;

  17. $result['weekly']  = $w;

  18. $result['daily']   = $d;

  19.            }

  20.        }else{

  21. $y=    floor($extend/365);

  22. if($y>=1){                //如果超过一年

  23. $start = strtotime($a.'+'.$y.'year');

  24. $a     = date('Y-m-d',$start);

  25. //判断是否真的已经有了一年了,如果没有的话就开减

  26. if($start>$stop){

  27. $a = date('Y-m-d',strtotime($a.'-1 month'));

  28. $m =11;

  29. $y--;    

  30.                }

  31. $extend = ($stop-strtotime($a))/86400;

  32.            }

  33. if(isset($m)){

  34. $w = floor($extend/7);

  35. $d = $extend-$w*7;

  36.            }else{

  37. $m = isset($m)?$m:round($extend/30);

  38. $stop>=strtotime($a.'+'.$m.'month')?$m:$m--;

  39. if($stop>=strtotime($a.'+'.$m.'month')){

  40. $d=$w=($stop-strtotime($a.'+'.$m.'month'))/86400;

  41. $w = floor($w/7);

  42. $d = $d-$w*7;

  43.                }

  44.            }

  45. $result['yearly']  = $y;

  46. $result['monthly'] = $m;

  47. $result['weekly']  = $w;

  48. $result['daily']   = isset($d)?$d:null;

  49.        }

  50. returnarray_filter($result);

  51.    }

  52. echo'<pre />';

  53.    print_r(format('2013-4-2','2013-5-1'));

  54. echo'<pre />';

  55. echo'<hr />';

  56. $ret_arr=format('2013-3-2','2013-5-1');

  57. echo'共'.$ret_arr['extends'].'天';

  58. echo'<br />';

  59. echo$ret_arr['yearly'].'年';

  60. echo$ret_arr['monthly'].'月';

  61. echo$ret_arr['weekly'].'周';

  62. echo$ret_arr['daily'].'天';

  63. ?>

输出:


Array
(
    [extends] => 29
    [weekly] => 4
    [daily] => 1
)

共60天
年1月4周1天


7、获取两日期差值数组

方法一:


  1. <?php

  2. /**

  3.         * 获取两日期差值数组

  4.         *

  5.         * 边界 限定符:

  6.         *

  7.         * () 不包含边界

  8.         * [] 包含边界

  9.         * (] 不包含左边界

  10.         * [) 不包含右边界

  11.         *

  12.         * @param string $start_create_date

  13.         * @param string $end_create_date

  14.         * @param string $inclusive 是否包含边界

  15.         *

  16.         * @return array

  17.         */

  18. function getDateDiffArray($start_create_date ,$end_create_date ,$inclusive='[]'){

  19. static$day_interval = 86400;

  20. $data = array();

  21. $start = (int) strtotime($start_create_date);

  22. $end = (int) strtotime($end_create_date);

  23. if ($start > $end) return$data;

  24. for ($start += $day_interval;$start < $end;){

  25. $data[] = date('Y-m-d',$start);

  26. $start += $day_interval;

  27.            }

  28. switch ($inclusive){

  29. case'()':

  30. break;

  31. case'[]':

  32. array_unshift($data,$start_create_date);

  33. if ($start_create_date != $end_create_date)

  34. $data[] = $end_create_date;

  35. break;

  36. case'(]':

  37. $data[] = $end_create_date;

  38. break;

  39. case'[)':

  40. array_unshift($data,$start_create_date);

  41. break;

  42. default:

  43. break;

  44.            }

  45. return$data;

  46.        }

  47. echo'<pre />';

  48.        print_r( getDateDiffArray("2013-04-26","2013-05-01"));

  49. echo'<pre />';

  50. ?>

输出:


Array
(
    [0] => 2013-04-26
    [1] => 2013-04-27
    [2] => 2013-04-28
    [3] => 2013-04-29
    [4] => 2013-04-30
    [5] => 2013-05-01
)


方法二:



  1. <?php

  2. function intervalDate($begDate,$endDate){

  3. $date = array();

  4. $begTime = strtotime($begDate)+86400;

  5. $endTime = strtotime($endDate);

  6. while($begTime < $endTime){

  7. $date[]= date("Y-n-d",$begTime);

  8. $begTime+=86400;

  9.        }

  10. return$date;

  11.    }

  12. $begDate="2013-04-26";

  13. $endDate="2013-05-01";

  14. echo"<pre>";

  15.    print_r(intervalDate($begDate,$endDate));

  16. ?>


输出:


Array
(
    [0] => 2013-4-27
    [1] => 2013-4-28
    [2] => 2013-4-29
    [3] => 2013-4-30
)


8、获取某个日期的 周数、周对应的开始结束时间


  1. <?php

  2. //获取某个日期的 周数、周对应的开始结束时间

  3. function getWeekStartEndDay($day){

  4. $g  = strftime("%u",strtotime($day));

  5. returnarray(

  6. 'week_num'=>strftime("%V",strtotime($day)),

  7. 'week_start_day'=>strftime('%Y-%m-%d',strtotime($day)-($g-1)*86400),

  8. 'week_start_day_cn'=>strftime('%Y年%m月%d日',strtotime($day)-($g-1)*86400),

  9. 'week_end_day'=>strftime('%Y-%m-%d',strtotime($day) + (7-$g)*86400),

  10. 'week_end_day_cn'=>strftime('%Y年%m月%d日',strtotime($day) + (7-$g)*86400)

  11.        );

  12.    }

  13. echo'<pre />';

  14.    print_r(getWeekStartEndDay("2013-04-26"));

  15. ?>

输出:


Array
(
    [week_num] => 
    [week_start_day] => 2013-04-27
    [week_start_day_cn] => 2013年04月27日
    [week_end_day] => 2013-05-03
    [week_end_day_cn] => 2013年05月03日
)


9、php获取服务器时间

http://xuqin.blog.51cto.com/5183168/1177160

10、php根据出生日期计算年龄

http://xuqin.blog.51cto.com/5183168/1168369





      本文转自许琴 51CTO博客,原文链接:http://blog.51cto.com/xuqin/1186951,如需转载请自行联系原作者




上一篇:Redis 客户端与服务器连接流程实例


下一篇:C#里巧用DateTime预设一些可选的日期范围(如本年度、本季度、本月等)