【问题标题】:PHP difference between time() and getTimestamp() object [Year 2038 bug]time() 和 getTimestamp() 对象之间的 PHP 区别 [2038 年错误]
【发布时间】:2014-06-27 08:16:16
【问题描述】:

有什么区别:

$now = time();

$now = new DateTime();
$now->getTimestamp();

考虑到 32 位 INT 的限制(即 2038 年错误),在 32 位系统中使用 getTimestamp() 是否安全?

编辑:

有关此问题的更多信息,请查看此链接:What is a Unix timestamp and why use it?

【问题讨论】:

  • “安全”——什么意思?
  • @Jack M.:那个链接并没有解释你到底害怕什么。
  • 更安全显然:3v4l.org/Jeo1V#v520
  • 32 位系统的有限 INT 值比 64 位系统短;因此在 2038 年,32 位系统显然无法存储 time() INT 数字

标签: php


【解决方案1】:

你试过什么?你做了什么来确认你的问题?

足够简单:

$datetime = new DateTime('5000-01-01');
var_dump($datetime->format('d.m.Y'));
var_dump($datetime->getTimestamp());

输出:

string(10) "01.01.5000"
bool(false)

所以:不,你不是 save 在使用来自 DateTime 的时间戳。

无论如何:问题可能是一个很好的参考,但很容易通过测试找到。

关于 DateTime 的意义不是获取 Unix Timestamp。这是关于避免 Unix 时间戳。从您自己的 cmets 链接中查看答案:What is a Unix timestamp and why use it?

【讨论】:

  • 这不正确,PHP 手册中提到 DateTime::getTimestamp():获取 Unix 时间戳。它在 64 位系统上工作,而在 2038 年问题适用时,它在 32 位系统上返回 false。
  • 问题是关于 32 位系统 @TorstenRömer
【解决方案2】:

由于DateTime::getTimestamp() 在 32 位系统上返回 2038 年问题的 Unix 时间戳,因此当 2038 年问题适用时,它将在 32 位系统上返回 false(但仍适用于 64 位系统)。

所以我会说在 32 位系统上使用是不安全的。

【讨论】:

  • 使用 64 位,您将拥有更多a bit 的时间,但这也是有限的。 Unix 时间戳不保存!
  • @Jack M.:根据 PHP 手册,DateTime::getTimestamp() 将在适用 Year-2038 错误时返回 false。
  • @JackM。 BigInt 是你的数据库中的东西(你会得到它作为字符串)。 php 不能原生处理这个数据类型。 getTimestamp 返回一个整数。您应该真正将您的数据持久化为 SQL 中的 DateTime,并使用 DateTime 对象在 PHP 端工作。
  • 总结:最好不要在 PHP 中使用 Unix 时间戳。谢谢!
  • @JackM。任何语言。 SQL、Java、C#(甚至是 XML 或 JSON)
猜你喜欢
  • 2015-11-30
  • 2011-08-15
  • 1970-01-01
  • 1970-01-01
  • 2018-08-19
  • 2012-01-12
  • 2015-07-11
  • 2011-07-13
  • 1970-01-01
相关资源
最近更新 更多