PHP中UNIX时间戳和日期间的转换与计算实例


Posted in PHP onNovember 19, 2014

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()函数对于日期运算和验证非常有用,它可以自动校政越界的输入。如下所示:
<?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()的对比如下所示:

<?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()函数编写一个纪念日的倒计时程序,来介绍一下该函数在项目开发中的实际应用,示例代码如下所示:

<?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表单用户提交的出生日期,计算这个用户的年龄。如下所示:

<?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时间戳转变为以年度量的单位。

PHP 相关文章推荐
BBS(php &amp; mysql)完整版(五)
Oct 09 PHP
实用函数7
Nov 08 PHP
在smarty中调用php内置函数的方法
Feb 07 PHP
在wamp集成环境下升级php版本(实现方法)
Jul 01 PHP
php中url传递中文字符,特殊危险字符的解决方法
Aug 17 PHP
php获取当前时间的毫秒数的方法
Jan 26 PHP
php实现文本数据导入SQL SERVER
May 17 PHP
PHP闭包函数传参及使用外部变量的方法
Mar 15 PHP
thinkphp框架下404页面设置 仅三步
May 14 PHP
PHP简单实现二维数组赋值与遍历功能示例
Oct 19 PHP
PHP判断当前使用的是什么浏览器(推荐)
Oct 27 PHP
PHP7 整型处理机制修改
Mar 09 PHP
PHP中上传多个文件的表单设计例子
Nov 19 #PHP
PHP中使用GD库创建圆形饼图的例子
Nov 19 #PHP
PHP图像处理之imagecreate、imagedestroy函数介绍
Nov 19 #PHP
PHP图像处理之使用imagecolorallocate()函数设置颜色例子
Nov 19 #PHP
PHP GD库生成图像的几个函数总结
Nov 19 #PHP
PHP中绘制图像的一些函数总结
Nov 19 #PHP
PHP中round()函数对浮点数进行四舍五入的方法
Nov 19 #PHP
You might like
解析百度搜索结果link?url=参数分析 (全)
2012/10/09 PHP
PHP实现无限级分类(不使用递归)
2015/10/22 PHP
javascript之解决IE下不渲染的bug
2007/06/29 Javascript
兼容IE、firefox以及chrome的js获取时间(getFullYear)
2014/07/04 Javascript
jQuery中addClass()方法用法实例
2015/01/05 Javascript
jquery实现的动态回到顶部特效代码
2015/10/28 Javascript
JS判断浏览器是否安装flash插件的简单方法
2016/09/13 Javascript
基于Vue实例对象的数据选项
2017/08/09 Javascript
详细分析单线程JS执行问题
2017/11/22 Javascript
浅析Angular19 自定义表单控件
2018/01/31 Javascript
详解如何用typescript开发koa2的二三事
2018/11/13 Javascript
如何在JavaScript中谨慎使用代码注释
2019/06/21 Javascript
解决layui页面按钮点击无反应,也不报错的问题
2019/09/29 Javascript
Vue3项目打包后部署到服务器 请求不到后台接口解决方法
2020/02/06 Javascript
基于 Vue 的 Electron 项目搭建过程图文详解
2020/07/22 Javascript
[57:29]Alliance vs KG 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/17 DOTA
python实现的文件夹清理程序分享
2014/11/22 Python
Python异常学习笔记
2015/02/03 Python
初步介绍Python中的pydoc模块和distutils模块
2015/04/13 Python
利用Python自带PIL库扩展图片大小给图片加文字描述的方法示例
2017/08/08 Python
Python实现的网页截图功能【PyQt4与selenium组件】
2018/07/12 Python
Python 从列表中取值和取索引的方法
2018/12/25 Python
详解将Python程序(.py)转换为Windows可执行文件(.exe)
2019/07/19 Python
使用IDLE的Python shell窗口实例详解
2019/11/19 Python
python 利用turtle库绘制笑脸和哭脸的例子
2019/11/23 Python
Django celery异步任务实现代码示例
2020/11/26 Python
python通过cython加密代码
2020/12/11 Python
Silk’n激光脱毛器官网:silkn.com
2016/10/06 全球购物
领先的英国注册在线药房 :Simply Meds Online
2019/03/28 全球购物
香港家用健身器材、运动器材及健康美容仪器专门店:FitBoxx
2019/12/05 全球购物
《狼和小羊》教学反思
2014/04/20 职场文书
计算机应用专业自荐信
2014/07/05 职场文书
会计专业自荐书
2014/07/08 职场文书
护士求职自荐信
2015/03/25 职场文书
公司管理制度范本
2015/08/03 职场文书
Python序列化模块JSON与Pickle
2022/06/05 Python