无法理解 php 中 time() 和 date() 的性质

Posted

技术标签:

【中文标题】无法理解 php 中 time() 和 date() 的性质【英文标题】:can't understand the nature of time() and date() in php 【发布时间】:2012-06-30 03:37:33 【问题描述】:
date("Y",1340896077)//1340896077 are the seconds till 2012 from 1970

给2012这是正常的

And date("Y",1940896077)

给2031也是正常的

但是 date("Y",2240896077)

给出1904,这绝对不正常。它应该给出2041。

现在我想解释一下 php 中的 time() 和 date()。

【问题讨论】:

你也可以调用 echo PHP_INT_MAX;检查最大整数并突然变得(可悲)清晰。 【参考方案1】:

PHP 使用 32 位整数。

32位整数限制为2,147,483,647

在您的第三个示例中,值溢出。把它想象成一个汽车公里计数器。它被限制在某个值(在我们的例子中为 2,147,483,647),一旦你将这个值传递回 0。

这可能会导致Year 2038 problem(还记得 2000 年的错误吗?类似的概念)。

在“PHP 开发者会议纪要”中有一个proposal to add 64bit integer,我不确定它走了多远,他们的政策重新分级时间相关功能是什么。

希望有帮助:)

【讨论】:

@某人有麻烦我不能告诉你。 Afaik 这将影响很多语言(就像 C/C++ 程序一样,它们使用 time_t ,它是无符号整数,在 32 位系统上是 32 位宽)。静态类型语言将不得不(更有可能)移动到 64 位整数,PHP 呢我不确定,但我在 PHP 中看到了 64 位整数的提案(找不到提案)。 PHP 在今天的 64 位系统上已经可以很好地处理 64 位整数。我们只需要在未来 25 年内迁移到 64 位系统。【参考方案2】:

您看到的是Y2K38 bug。 2240896077 对于 32 位整数来说太大,会溢出。

【讨论】:

64位系统的最大值是多少 哦,mysql 的 bigint 是 64 位的,那为什么我的系统支持它 可能您的 PHP 没有编译为 64 位 PHP。但我也不认为 MySQL 的 存储要求与其运行的系统有很大关系,这与 PHP 不同。【参考方案3】:

来自手册:

时间戳的有效范围通常是从 1901 年 12 月 13 日星期五开始 格林威治标准时间 20:45:54 至格林威治标准时间 2038 年 1 月 19 日星期二 03:14:07。 (这些是日期 对应于 32 位有符号的最小值和最大值 整数)。然而,在 PHP 5.1.0 之前,这个范围被限制在 在某些系统(例如 Windows)上为 01-01-1970 至 19-01-2038。

http://php.net/manual/en/function.date.php

【讨论】:

【参考方案4】:

时间戳的有效范围通常是从 1901 年 12 月 13 日星期五开始 格林威治标准时间 20:45:54 至格林威治标准时间 2038 年 1 月 19 日星期二 03:14:07。 (这些是日期 对应于 32 位有符号的最小值和最大值 整数)。然而,在 PHP 5.1.0 之前,这个范围被限制在 在某些系统(例如 Windows)上为 01-01-1970 至 19-01-2038。

来自: http://php.net/manual/en/function.date.php

【讨论】:

惊人的同时发生 :)。我们都同时按下了答案按钮,令人惊讶的是,答案是一样的。

以上是关于无法理解 php 中 time() 和 date() 的性质的主要内容,如果未能解决你的问题,请参考以下文章

PHP Date/Time 简介

PHP Date/Time 简介

php 如何将数据库中读出的datetime类型的时间转化成date类型的时间。 循环过程也需要。

php [测试日期和时间]在刀片视图中测试时间和日期Laravel #laravel #test #datetime #date #time

php中 now()与date() 有啥区别啊

PHP cookie设置后无法正常工作