UNIX时间戳及日期的转换与计算

摘要:
UNIX时间戳是一种简洁的保存日期和时间的方法,在大多数UNIX系统中是一种保存当前日期和时间,在大多数计算机语言中是表示日期和时间标准格式。因为UNIX时间戳是32位数字格式,所以它特别适合计算机处理,例如计算两个时间点之间的天数。因此,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
echodate("Y-m-d",mktime(0,0,0,12,36,2008))." ";    //日期超过31天,计算后输出 2009-01-05
echodate("Y-m-d",mktime(0,0,0,14,1,2010))." ";     //月份超过12月,计算后输出2011-02-01
echodate("Y-m-d",mktime(0,0,0,1,1,2012))." ";      //没有问题的转变,输出结果2012-01-01
echodate("Y-m-d",mktime(0,0,0,1,1,99))." ";        //会将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
echodate("Y-m-d", strtotime("now"));                  //输出现在的时间戳
echodate("Y-m-d", strtotime("8 may 2012"));           //输出2012-05-08
echodate("Y-m-d", strtotime("+1 day"));               //输出现在的日期加1天
echodate("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
16
17
18
19
20
21
22
23
<?php
$now=strtotime("now"); //当前时间
$endtime= strtotime("2014-08-18 08:08:08"); //设定毕业时间,转成时间戳
 
$second= $endtime-$now; //获取毕业时间到现在时间的时间戳(秒数)
$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); //从这个时间戳中换算出剩余的小时数
 
$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时间戳转变为以年度量的单位。

 

>> 本文固定链接: http://php.ncong.com/php_course/date/unixdate.html

>> 转载请注明:  2014年08月07日 于 恩聪PHP学习教程 发表

免责声明:文章转载自《UNIX时间戳及日期的转换与计算》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C#正则表达式合并连续空格为单个空格忘记root密码,修改方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

laravel框架使用生涯

手工安装laravel http://laravelacademy.org/resources-download 1、将下载的文件复制到虚拟主机目录 2、在Apache的配置文件配置一个虚拟主机【注意,需要指向 public目录下】 <VirtualHost *:80> DocumentRoot "C:phpStudyWWWlarav...

PHP curl参数详解(转)

curl_setopt (PHP 4 >= 4.0.2) curl_setopt -- 为CURL调用设置一个选项 描述 bool curl_setopt (int ch, string option, mixed value) curl_setopt()函数将为一个CURL会话设置选项。option参数是你想要的设置,value是这个选项给定的值。...

微信公众号开发教程详细完整第1篇

| 版权声明:本文为博主原创文章,未经博主允许不得转载。 从2014.12月份左右接触微信公众号开发,短短续续也有了一年多在这期间做了不知道多少个公众号,各种奇葩的功能都有涉猎。从一无所知的小白,到对整个微信公众号生态的理解,不知道经历了多少个日日夜夜,鬼知道我经历了什么。此次教程不谈什么微信公众号O2O(基本死光了)也不谈什么分答,大字(基本被微信封的差...

PHP 设计模式 笔记与总结(5)PHP 魔术方法的使用

PHP 魔术方法的使用 ① __get/__set:将对象的属性进行接管 当访问一个不存在的对象属性时: index.php <?php define('BASEDIR',__DIR__); //定义根目录常量 include BASEDIR.'/Common/Loader.php'; spl_autoload_register('\Commo...

[转]Sublime text2安装php beautifier

sublime上格式化php的插件找到两个:php tidy和php beautifier,其中php tidy是按照wordpress风格组织代码,不喜欢括号里的那么多空格。。虽然在github上有人改造了一下变成ci风格,但装起来还是比较麻烦的 而php beautifier的安装也同样另人抓狂,但好歹也摸索出来了: 1. 终端下使用pear安装php...

php中的整数类型和浮点型数据类型

php中,整数都是有符号的。一个数,总是要占用内存空间。(字节),在php中,一个整数,一般占用四个字节(与平台有关),一个字节占8bitphp语法中,二进制整数的最高位表示符号位,0表示整数,1表示负数。通过PHP_INT_SIZE可以显示我们自己的机器,一个整数用几个字节表示echo PHP_INT_SIZE;通过PHP_INT_MAX可以显示int最...