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 相关文章推荐
PHP一些常用的正则表达式字符的一些转换
Jul 29 PHP
php 常用算法和时间复杂度
Jul 01 PHP
PHP 正则判断中文UTF-8或GBK的思路及具体实现
Nov 26 PHP
PHP使用Session遇到的一个Permission denied Notice解决办法
Jul 30 PHP
如何让搜索引擎抓取AJAX内容解决方案
Aug 25 PHP
php递归调用删除数组空值元素的方法
Apr 28 PHP
PHP根据图片色界在不同位置加水印的方法
Jul 01 PHP
php无限分类使用concat如何实现
Nov 05 PHP
针对thinkPHP5框架存储过程bug重写的存储过程扩展类完整实例
Jun 16 PHP
PHP基于DateTime类解决Unix时间戳与日期互转问题【针对1970年前及2038年后时间戳】
Jun 13 PHP
在php的yii2框架中整合hbase库的方法
Sep 20 PHP
thinkPHP3.2使用RBAC实现权限管理的实现
Aug 27 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
PHP 获取MSN好友列表的代码(2009-05-14测试通过)
2009/09/09 PHP
php通过字符串调用函数示例
2014/03/02 PHP
phpcmsv9.0任意文件上传漏洞解析
2020/10/20 PHP
javascript中的107个基础知识收集整理 推荐
2010/03/29 Javascript
Js sort排序使用方法
2011/10/17 Javascript
hover的用法及live的用法介绍(鼠标悬停效果)
2013/03/29 Javascript
jquery 简单应用示例总结
2013/08/09 Javascript
判断ie的两种简单方法
2013/08/12 Javascript
Javascript中的String对象详谈
2014/03/03 Javascript
浅谈Javascript变量作用域问题
2014/12/16 Javascript
javascript实现多级联动下拉菜单的方法
2015/02/06 Javascript
JQuery显示、隐藏div的几种方法简明总结
2015/04/16 Javascript
js实现input密码框提示信息的方法(附html5实现方法)
2016/01/14 Javascript
JS实现选项卡效果的代码实例
2019/05/20 Javascript
js判断在哪个浏览器打开项目的方法
2020/01/21 Javascript
js常用方法、检查是否有特殊字符串、倒序截取字符串操作完整示例
2020/01/26 Javascript
js实现点赞按钮功能的实例代码
2020/03/06 Javascript
Python getopt模块处理命令行选项实例
2014/05/13 Python
Python+matplotlib实现计算两个信号的交叉谱密度实例
2018/01/08 Python
python接口自动化测试之接口数据依赖的实现方法
2019/04/26 Python
python框架flask表单实现详解
2019/11/04 Python
Python要如何实现列表排序的几种方法
2020/02/21 Python
Matplotlib自定义坐标轴刻度的实现示例
2020/06/18 Python
Python3 用matplotlib绘制sigmoid函数的案例
2020/12/11 Python
python实现马丁策略的实例详解
2021/01/15 Python
世界上最大的各式箱包网络零售店:eBag
2016/07/21 全球购物
巴西购物网站:Estrela10
2018/12/13 全球购物
潘多拉珠宝美国官方网站:Pandora US
2020/06/18 全球购物
读书心得体会
2013/12/28 职场文书
科长竞聘演讲稿
2014/05/16 职场文书
缓刑期间思想汇报范文
2014/10/10 职场文书
征求意见函
2015/06/05 职场文书
JavaScript原始值与包装对象的详细介绍
2021/05/11 Javascript
HTML5基础学习之文本标签控制
2022/03/25 HTML / CSS
为什么MySQL不建议使用SELECT *
2022/04/03 MySQL
详解Golang如何实现支持随机删除元素的堆
2022/09/23 Python