UNIX时间戳及⽇期的转换与计算
UNIX时间戳是保存⽇期和时间的⼀种紧凑简洁的⽅法,是⼤多数UNIX系统中保存当前⽇期和时间的⼀种⽅法,也是在⼤多数计算机语⾔中表⽰⽇期和时间的⼀种标准格式。以32位整数表⽰格林威治标准时间,例如,使⽤证书11230499325表⽰当前时间的时间戳。UNIX时间戳是从1970年1⽉1⽇零点(UTC/GMT的午夜)开始起到当前时间所经过的秒数。1970年1⽉1⽇零点作为所有⽇期计算的基础,这个⽇期通常成为UNIX纪元。
因为UNIX时间戳是⼀个32位的数字格式,所以特别适⽤于计算机处理,例如计算两个时间点之间相差的天数。另外,由于⽂化和地区的差异,存在不同的时间格式,以及时区的问题。所以UNIX时间戳也是根据⼀个时区进⾏标准化⽽设计的⼀种通⽤格式,并且这种格式可以很容易地转换为任何格式。也因为UNIX时间戳是⼀个32位的证书表⽰的,所以在处理1902年以前或2038年以后的事件将会遇到⼀些问题。另外,在Windows下,由于时间戳不能为负数,所以使⽤PHP中提供的时间戳函数处理1970年之前的⽇期,就会发⽣错误。要使PHP代码具有可移植性,必须记住这⼀点。
将⽇期和时间转变成UNIX时间戳
在PHP中,如果需要将⽇期和时间转变成UNIX时间戳,可以调⽤mktime()函数。该函数的原型如下所⽰:
int mktime([int hour [,int minute[,int second[,int month[,int day[int year]]]]]])
该函数中所有参数都是可选的,如果参数为空,默认将当前时间转变成UNIX时间戳。这样,和直接调⽤time()函数获取当前的UNIX时间戳功能相同。参数也可以从右向左省略,任何省略的参数会被设置成本地⽇期和时间的当前值。如果只想转变⽇期,对具体的时间不在乎,可以将前三个转变时间的参数都设置为0.mktime()函数对于⽇期运算和验证⾮常有⽤,它可以⾃动校政越界的输⼊。如下所⽰:
1 2 3 4 5 6<?php
echo date("Y-m-d",mktime(0,0,0,12,36,2008))."\n"; //⽇期超过31天,计算后输出 2009-01-05 echo date("Y-m-d",mktime(0,0,0,14,1,2010))."\n"; //⽉份超过12⽉,计算后输出2011-02-01 echo date("Y-m-d",mktime(0,0,0,1,1,2012))."\n"; //没有问题的转变,输出结果2012-01-01 echo date("Y-m-d",mktime(0,0,0,1,1,99))."\n"; //会将99年转变为1999年, 1990-01-01
>
如果有需要将任何英⽂⽂本的⽇期时间描述直接解析为UNIX时间戳,可以使⽤strtotime()函数,该函数的圆形如下所⽰:
int strtotime(string time[,int now])
函数strtotime()可以⽤英语的⾃然语⾔创建讴歌时刻的时间戳,接受⼀个包含美国英语⽇期格式的字符串并尝试将其解析为UNIX时间戳(⾃January 1 1970 00:00:00 GMT起的描述),其值相对于now参数给出的时间,如果没有提供次参数则⽤系统当前时间。该函数执⾏成功则返回时间戳,否则返回FALSE。和mktime()的对⽐如下所⽰:
1 2 3 4 5 6<?php
echo date("Y-m-d", strtotime("now")); //输出现在的时间戳echo date("Y-m-d", strtotime("8 may 2012")); //输出2012-05-08 echo date("Y-m-d", strtotime("+1 day")); //输出现在的⽇期加1天echo date("Y-m-d", strtotime("last monday")); //输出2012-04-02 >
下例通过使⽤strtotime()函数编写⼀个纪念⽇的倒计时程序,来介绍⼀下该函数在项⽬开发中的实际应⽤,⽰例代码如下所⽰:
1 2 3 4 5 6 7 8 9
10 11 12 13 14 15<?php
$now=strtotime("now"); //当前时间
$endtime= strtotime("2014-08-18 08:08:08"); //设定毕业时间,转成时间戳
$second= $endtime-$now; //获取毕业时间到现在时间的时间戳(秒数)unix时间戳转换日期格式
$year= floor($second/3600/24/365); //从这个时间戳中换算出年头数
$temp=$second-$year*365*24*3600; //从这个时间戳中去掉整年的秒数,就剩下⽉份的秒数$month=floor($temp/3600/24/30); //从这个时间戳中共换算出⽉数
$temp=$temp-$month*30*3600*24; //从时间戳中去掉整⽉的秒数,就剩下天的描述
$day= floor($temp/24/3600); //从这个时间戳中换算出剩余的天数
$temp=$temp-$day*3600*24; //从这个时间戳中去掉整天的秒数,就剩下⼩时的秒数$hour= floor($temp/3600); //从这个时间戳中换算出剩余的⼩时数
15 16 17 18 19 20 21 22 23$hour= floor($temp/3600); //从这个时间戳中换算出剩余的⼩时数
$temp=$temp- $hour*3600; //从时间戳中去掉⼩时的秒数,就剩下分的秒数
$minute=floor($temp/60); //从这个时间戳中换算出剩余的分数
$second1=$temp-$minute*60; //最后只有剩余的秒数了
echo"距离培训毕业还有($year)年($month)⽉($day)天($hour)⼩时($minute)分($second1)秒。"; >
注意:如果给定的年份是两位数字的格式,则其值0-69表⽰2000-2069,70-100表⽰1970-2000。
⽇期的计算
在PHP中,计算两个⽇期之间相隔的长度,最简单的⽅法就是通过计算两个UNIX时间戳之差来获得。例如,在PHP脚本中接收来⾃HTML 表单⽤户提交的出⽣⽇期,计算这个⽤户的年龄。如下所⽰:
1 2 3 4 5 6 7 8 9 10 11 12<?php
//从表单中接收⽤户提交的出⽣⽇期中的年份、⽉份、天
$year= 1981;
$month= 11;
$day= 05;
$birthday= mktime(0,0,0,$month,$day,$year); //将出⽣⽇期转变为UNIX时间戳$nowdate= time(); //调⽤time()函数获取当前时间的UNIX时间戳
$ageunix= $nowdate-$birthday; //两个时间戳相减获取⽤户年龄的UNIX时间戳$age= floor($ageunix/3600/24/365); //将UNIX时间戳除以⼀年的秒数获取⽤户的年龄echo"年龄:$age";
>
在以上的脚本中,调⽤mktime()函数将从⽤户出⽣⽇期转变为UNIX时间戳,再调⽤time()函数获取当前时间的UNIX时间戳。因为这个⽇期的格式都是使⽤整数表⽰的,所以可以将他们相减。⼜将计算后获取的UNIX时间戳除以⼀年的秒数,将UNIX时间戳转变为以年度量的单位。
>> 转载请注明: 2014年08⽉07⽇ 于 发表
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论