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,如需转载请自行联系原作者