PHP中UNIX时间戳与日期互转及计算实战
本文介绍PHP中处理UNIX时间戳的核心方法,涵盖从标准函数mktime()和strtotime()的使用,到基于时间戳差值的实际日期计算场景。帮助开发者掌握跨时区、跨版本的日期运算技巧。
UNIX时间戳基础
UNIX时间戳(Unix Timestamp)是表示时间的一种紧凑且通用的格式,定义为从1970年1月1日零点(UTC/GMT午夜)开始至当前时刻所经过的秒数。在绝大多数计算机语言和系统中,它以32位整数存储,便于高效处理和比较。由于这种标准化设计,时间戳可以轻松转换为不同地区和文化的具体日期格式,但也存在局限性:例如32位整数无法表示2038年之后或1902年之前的时间;且在部分Windows环境下,时间戳不能为负数可能导致1970年之前的日期计算错误。为保证代码可移植性,需注意这些边界情况。
将日期和时间转为UNIX时间戳
在PHP中,主要有两种常用的函数用于将人类可读的日期时间转换为UNIX时间戳:一是按数值参数精确构造的 mktime(),二是解析自然语言描述的 strtotime()。
第1步:使用 mktime() 精确构造时间戳
目的:当拥有明确的年、月、日、时、分、秒数值时,将其转化为对应的时间戳。该函数的强大之处在于它会自动校验并校正越界输入。
- 入口/语法:调用内置函数
mktime(hour, minute, second, month, day, year)。 - 关键参数:所有参数均为可选,如果省略,系统默认填入当前时间的对应值。若仅需转换日期,可将前三项时间参数设为
0。 - 特殊规则:当年份以两位数传入时,0-69 代表 2000-2069年,而 70-100 代表 1970-2000年。
- 完成状态:返回一个整数类型的时间戳。
<?php
echo date("Y-m-d", mktime(0,0,0,12,36,2008))."\n"; // 输入日期超过月份天数,自动进位:输出 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"; // 两位年份转换:输出 1990-01-01
?>
第2步:使用 strtotime() 解析自然语言
目的:直接解析包含美国英语格式的字符串描述(如 "now", "+1 day"),获取时间戳。该方法比逐个设置参数更灵活。
- 入口/语法:调用
strtotime(string $time [, int $now])。 - 重要参数:
$time是描述时间的英文字符串;$now是参考基准时间(未提供则默认为当前系统时间)。 - 结果:执行成功返回整型时间戳,失败则返回 FALSE。
<?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")); // 基于当前时间增加一天
echo date("Y-m-d", strtotime("last monday")); // 获取上个周一的日期
?>
基于时间戳的日期计算
由于时间戳本质上是自纪元以来的秒数累加,计算两个日期之间的差值最为简单直接的方法就是求出两个时间戳相减的结果。
第1步:构建计算逻辑与脚本实例
目的:演示如何通过时间戳差值计算出精确的年龄,或者倒计时(如距离毕业还有多少年、月、日)。这里以一个毕业倒计时程序为例,展示从时间戳提取年、月、日的数学过程。
- 操作:定义目标时间和当前时间,分别转化为时间戳,做减法得到剩余的总秒数。
- 换算:利用
floor()取整函数配合除法运算,逐级剥离秒、分、时、天、月和年。 - 注意事项:此算法采用固定平均天数(一年按365天、一月按30天近似估算)进行换算,适用于大致推算;对于需精确到天且涉及闰月的场景,建议结合日期对象库进一步验证。
<?php
$now = strtotime("now"); // 获取当前时间戳
$endtime = strtotime("2014-08-18 08:08:08"); // 设定目标结束时间戳
// 1. 获取两者相差的总秒数
$second = $endtime - $now;
// 2. 逐级拆解时间单位
$year = floor($second / (365 * 24 * 3600)); // 计算整年数
$temp = $second - $year * 365 * 24 * 3600; // 去除整年后的剩余秒数
$month = floor($temp / (30 * 24 * 3600)); // 计算整月数(约等于)
$temp = $temp - $month * 30 * 24 * 3600;
$day = floor($temp / (24 * 3600)); // 计算整天数
$temp = $temp - $day * 24 * 3600;
$hour = floor($temp / 3600); // 计算整小时数
$temp = $temp - $hour * 3600;
$minute = floor($temp / 60); // 计算整分钟数
$second_final = $temp - $minute * 60; // 剩余秒数
echo "距离培训毕业还有($year)年($month)月($day)天($hour)小时($minute)分($second_final)秒。";
?>
年龄计算示例:同理,若要计算用户年龄,只需将 $endtime 替换为用户出生日期经过 mktime() 转换后的时间戳,用当前时间戳减去出生日期戳,再除以一年的秒数即可得出岁数。
简要总结
掌握了 mktime() 和 strtotime() 这两个核心工具,就能在PHP中灵活应对绝大多数时间转换需求。在处理时间间隔时,牢记“先转时间戳、再作差值”的原则,能够极大简化逻辑复杂度。以上就是PHP中UNIX时间戳和日期间转换与计算的详细内容,更多关于PHP时间函数应用的技术资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









