PHP日期时间用法大全
1.一般在PHP初始化文件头部,首先要设置正确的时区,否则主机默认时区不对的话,造成PHP代码中用到的日期时间都不对。
-
echo date_default_timezone_get();//获取主机默认时区
-
date_default_timezone_set('Asia/Shanghai');//'Asia/Shanghai' 亚洲/上海 或者:
-
date_default_timezone_set('PRC');//其中PRC为“中华人民共和国”
-
date_default_timezone_set('Asia/Shanghai');
-
$time=date("Y-m-d H:i:s");
-
$time=StrToTime($time);
2.获取本地日期时间:
-
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() 生成的日期/时间
-
$format = '%d/%m/%Y %H:%M:%S';
-
$strf = strftime($format);
-
-
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天表示(也可以用负数):
-
$lastday = mktime(0, 0, 0, 3, 0, 2000);
-
echostrftime("Last day in Feb 2000 is: %d", $lastday);
7.time -- 返回当前的 Unix 时间戳
这个时间戳,一般我们作为参数,用作前面的函数,比如date()
-
$nextWeek = time() + (7 * 24 * 60 * 60); // 7天
-
echo'Next Week: '. date('Y-m-d', $nextWeek) ."\n";
二、时间日期转换
1、checkdate(month,day,year)函数验证指定的值合法性,该函数返回 true,否则返回 false。
-
<?php
-
if(checkdate(4,31,2013)==true){//false
-
echo 1;
-
}
-
else{
-
echo 0;
-
}
-
if(checkdate(4,30,2013)==true){//true
-
echo 1;
-
}
-
else{
-
echo 0;
-
}
-
?>
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、获取指定日期
-
<?php
-
date_default_timezone_set('Asia/Shanghai');
-
echo"今天:",date("Y-m-d",time()),"<br>";
-
echo"今天:",date("Y-m-d",strtotime("26 april 2013")),"<br>";
-
echo"昨天:",date("Y-m-d",strtotime("-1 day")), "<br>";
-
echo"明天:",date("Y-m-d",strtotime("+1 day")), "<br>";
-
echo"一周后:",date("Y-m-d",strtotime("+1 week")), "<br>";
-
echo"一周零两天四小时两秒后:",date("Y-m-d G:H:s",strtotime("+1 week 2 days 4 hours 2 seconds")), "<br>";
-
echo"下个星期四:",date("Y-m-d",strtotime("next Thursday")), "<br>";
-
echo"上个周一:".date("Y-m-d",strtotime("last Monday"))."<br>";
-
echo"一个月前:".date("Y-m-d",strtotime("last month"))."<br>";
-
echo"一个月后:".date("Y-m-d",strtotime("+1 month"))."<br>";
-
echo"十年后:".date("Y-m-d",strtotime("+10 year"))."<br>";
-
?>
5、php获取微博(博文、动态)发表于多久时间前
另一方法:http://xuqin.blog.51cto.com/5183168/1264254
-
<?php
-
function maktimes($time){
-
$t=time()-$time;
-
$f=array(
-
'31536000'=> '年',
-
'2592000' => '个月',
-
'604800' => '星期',
-
'86400' => '天',
-
'3600' => '小时',
-
'60' => '分钟',
-
'1' => '秒'
-
);
-
foreach ($fas$k=>$v){
-
if (0 !=$c=floor($t/(int)$k)){
-
return'发表于'.$c.$v.'前';
-
}
-
}
-
}
-
/*
-
date_default_timezone_set('Asia/Shanghai');
-
$time=date("Y-m-d H:i:s");
-
$time=StrToTime($time);
-
*/
-
$time="1366939913";
-
echo maktimes($time);
-
?>
6、php计算两日期剩余(间隔)时间天数
-
<?php
-
function format($a,$b){
-
//检查两个日期大小,默认前小后大,如果前大后小则交换位置以保证前小后大
-
if(strtotime($a)>strtotime($b)) list($a,$b)=array($b,$a);
-
$start = strtotime($a);
-
$stop = strtotime($b);
-
$extend = ($stop-$start)/86400;
-
$result['extends'] = $extend; //共多少天
-
if($extend<7){ //如果小于7天直接返回天数
-
$result['daily'] = $extend;
-
}elseif($extend<=31){ //小于28天则返回周数,由于闰年2月满足了
-
if($stop==strtotime($a.'+1 month')){
-
$result['monthly'] = 1;
-
}else{
-
$w = floor($extend/7);
-
$d = ($stop-strtotime($a.'+'.$w.' week'))/86400;
-
$result['weekly'] = $w;
-
$result['daily'] = $d;
-
}
-
}else{
-
$y= floor($extend/365);
-
if($y>=1){ //如果超过一年
-
$start = strtotime($a.'+'.$y.'year');
-
$a = date('Y-m-d',$start);
-
//判断是否真的已经有了一年了,如果没有的话就开减
-
if($start>$stop){
-
$a = date('Y-m-d',strtotime($a.'-1 month'));
-
$m =11;
-
$y--;
-
}
-
$extend = ($stop-strtotime($a))/86400;
-
}
-
if(isset($m)){
-
$w = floor($extend/7);
-
$d = $extend-$w*7;
-
}else{
-
$m = isset($m)?$m:round($extend/30);
-
$stop>=strtotime($a.'+'.$m.'month')?$m:$m--;
-
if($stop>=strtotime($a.'+'.$m.'month')){
-
$d=$w=($stop-strtotime($a.'+'.$m.'month'))/86400;
-
$w = floor($w/7);
-
$d = $d-$w*7;
-
}
-
}
-
$result['yearly'] = $y;
-
$result['monthly'] = $m;
-
$result['weekly'] = $w;
-
$result['daily'] = isset($d)?$d:null;
-
}
-
returnarray_filter($result);
-
}
-
echo'<pre />';
-
print_r(format('2013-4-2','2013-5-1'));
-
echo'<pre />';
-
echo'<hr />';
-
$ret_arr=format('2013-3-2','2013-5-1');
-
echo'共'.$ret_arr['extends'].'天';
-
echo'<br />';
-
echo$ret_arr['yearly'].'年';
-
echo$ret_arr['monthly'].'月';
-
echo$ret_arr['weekly'].'周';
-
echo$ret_arr['daily'].'天';
-
?>
输出:
Array
(
[extends] => 29
[weekly] => 4
[daily] => 1
)
共60天
年1月4周1天
7、获取两日期差值数组
方法一:
-
<?php
-
/**
-
* 获取两日期差值数组
-
*
-
* 边界 限定符:
-
*
-
* () 不包含边界
-
* [] 包含边界
-
* (] 不包含左边界
-
* [) 不包含右边界
-
*
-
* @param string $start_create_date
-
* @param string $end_create_date
-
* @param string $inclusive 是否包含边界
-
*
-
* @return array
-
*/
-
function getDateDiffArray($start_create_date ,$end_create_date ,$inclusive='[]'){
-
static$day_interval = 86400;
-
$data = array();
-
$start = (int) strtotime($start_create_date);
-
$end = (int) strtotime($end_create_date);
-
if ($start > $end) return$data;
-
for ($start += $day_interval;$start < $end;){
-
$data[] = date('Y-m-d',$start);
-
$start += $day_interval;
-
}
-
switch ($inclusive){
-
case'()':
-
break;
-
case'[]':
-
array_unshift($data,$start_create_date);
-
if ($start_create_date != $end_create_date)
-
$data[] = $end_create_date;
-
break;
-
case'(]':
-
$data[] = $end_create_date;
-
break;
-
case'[)':
-
array_unshift($data,$start_create_date);
-
break;
-
default:
-
break;
-
}
-
return$data;
-
}
-
echo'<pre />';
-
print_r( getDateDiffArray("2013-04-26","2013-05-01"));
-
echo'<pre />';
-
?>
输出:
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
)
方法二:
-
<?php
-
function intervalDate($begDate,$endDate){
-
$date = array();
-
$begTime = strtotime($begDate)+86400;
-
$endTime = strtotime($endDate);
-
while($begTime < $endTime){
-
$date[]= date("Y-n-d",$begTime);
-
$begTime+=86400;
-
}
-
return$date;
-
}
-
$begDate="2013-04-26";
-
$endDate="2013-05-01";
-
echo"<pre>";
-
print_r(intervalDate($begDate,$endDate));
-
?>
输出:
Array
(
[0] => 2013-4-27
[1] => 2013-4-28
[2] => 2013-4-29
[3] => 2013-4-30
)
8、获取某个日期的 周数、周对应的开始结束时间
-
<?php
-
//获取某个日期的 周数、周对应的开始结束时间
-
function getWeekStartEndDay($day){
-
$g = strftime("%u",strtotime($day));
-
returnarray(
-
'week_num'=>strftime("%V",strtotime($day)),
-
'week_start_day'=>strftime('%Y-%m-%d',strtotime($day)-($g-1)*86400),
-
'week_start_day_cn'=>strftime('%Y年%m月%d日',strtotime($day)-($g-1)*86400),
-
'week_end_day'=>strftime('%Y-%m-%d',strtotime($day) + (7-$g)*86400),
-
'week_end_day_cn'=>strftime('%Y年%m月%d日',strtotime($day) + (7-$g)*86400)
-
);
-
}
-
echo'<pre />';
-
print_r(getWeekStartEndDay("2013-04-26"));
-
?>
输出:
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,如需转载请自行联系原作者