mktime工作时间超过2038年

时间:2012-05-10 11:11:04

标签: php

我使用的是php 5.3.8版 并且mktime对我不起作用

这是代码

$dated= mktime(0,0,0,11,5,2038);
var_dump($dated);

输出为bool(false) 请建议我修复

3 个答案:

答案 0 :(得分:4)

mktime返回时间戳,这是一个整数(在PHP中,它实际上是一个有符号整数)。因此,32位系统的最大可能时间戳为19 Jan 2038 03:14:07 UTC(之后发生整数溢出)。对于更大的时间戳,您需要64位整数。

答案 1 :(得分:3)

来自PHP manual

  

在PHP 5.1.0之前,任何人都不支持负时间戳   已知版本的Windows和其他一些系统。因此   有效年限范围限于1970年至2038年。

一种可能的解决方案是使用ADOdb Date Time Library。该库通过用PHP浮点数(通常为64位)替换本机函数的有符号整数(通常为32位)来克服这些限制。

答案 2 :(得分:2)

使用C / C ++库转换时间的三个重要事项。

标准库中的

gmtime()或localtime()从time_t转换为struct tm,但time_t的分辨率是epoch的秒数。所以小数秒不计算在内。

mktime()从struct tm向后转换为time_t,但如果输入日期超出范围,则返回-1。 (请参阅2038年的问题:http://en.wikipedia.org/wiki/Year_2038_problem

如果你没有使用64位时间戳,即使你在64位机器上运行程序,你仍然有2038年的问题。有64位版本的功能,如gmtime64(),localtime64(),mktime64()可以解决年度超出范围的问题。 (参见页面:http://pic.dhe.ibm.com/infocenter/iseries/v7r1m0/index.jsp?topic=%2Frtref%2Fmktime64.htm

使用boost库的答案无法解决2038年的问题。从其页面注释:“内部boost :: gregorian :: date存储为32位整数类型。”