【问题标题】:Timestamp before 1970 is saved as 0000-00-00 00:00:001970 年之前的时间戳保存为 0000-00-00 00:00:00
【发布时间】:2015-03-28 22:51:14
【问题描述】:

我有一个对应于模型属性的时间戳列。 但是当我尝试在表中保存 1970 年之前的时间戳时,会出现 0000-00-00 00:00:00 的值。

我没有使用适当的格式吗? date更合适吗?有没有一种解决方法,所以我不需要更改我的架构?

【问题讨论】:

  • 您如何保存该值?
  • object->property = '1899-07-21 00:00:00';
  • 我不知道 object->property 是从哪里来的,但是 1900 年之前肯定比 1970 年之前要早很多...... 32 位 PHP 支持的范围
  • 确实如此,但 1970 年之前的任何日期都是如此
  • 首先,您说的是时间戳类型的数据库列,还是 PHP 时间戳值?

标签: php mysql database laravel


【解决方案1】:

Unix 纪元(或 Unix 时间或 POSIX 时间或 Unix 时间戳)是自 1970 年 1 月 1 日(UTC/GMT 午夜)以来经过的秒数,不包括闰秒(在 ISO 8601 中:1970-01- 01T00:00:00Z)。

如果您打算使用该日期之前的时间,我建议使用日期字段。

【讨论】:

    【解决方案2】:

    引用MySQL docs:

    TIMESTAMP 数据类型用于同时包含日期和时间部分的值。 TIMESTAMP 的范围为 '1970-01-01 00:00:01' UTC 到 '2038-01-19 03:14:07' UTC。

    【讨论】:

      【解决方案3】:

      这是一个真正的问题,但有一个很好的解决方法。

      我们知道关于时间戳,绝对 0 是在 1970 年。那么,我们为什么不改变我们的表示模型,将 1970 年 1 月 1 日视为耶稣出生的日子,即公元 1 月 1 日。如果这样做,那么 2000 年将由 3970(2000 + 1970)的数字表示。您可以像这样存储日期,并在查看或输入日期时进行转换。

      【讨论】:

      • 我不知道该怎么做。但我宁愿改变我的模式也不愿伪造日期发生。感谢您提供黑客信息。
      • 另外,根据另一个评论状态,MySQL timestamp 不会超过大约。 2038.
      • @brclz 有趣的一点。在这种情况下,您可能只想存储 1970 年到 2019 年之间的值,并为 HalfCentury 设置一个 int 列。两者结合会产生更好的结果,但支持所有可能日期的日期表示,包括作为新特征的时间值是首选。
      猜你喜欢
      • 1970-01-01
      • 2019-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多