【问题标题】:What could cause a MySQL time stamp to equal December 31, 1969什么可能导致 MySQL 时间戳等于 1969 年 12 月 31 日
【发布时间】:2016-04-25 19:28:16
【问题描述】:

在我正在运行的 PHP 站点中,用户表有一个名为 user_last_login 的日期时间字段。

我不时注意到,对于随机用户,该字段的值为 1969 年 12 月 31 日,而其他数千名用户仍然存储了准确的日期。

以下 PHP 代码用于在登录时生成此值:

$login_success_query->bindValue(':user_last_login', date("Y-m-d H:i:s"), PDO::PARAM_STR);

什么可能导致这个意外的默认日期值?

编辑(显示代码):

$user_last_login = strtotime($enrolled_user['user_last_login']);
$user_last_login = date( 'F j, Y | g:i a', $user_last_login );

【问题讨论】:

  • 让我们看看显示这个存储日期的代码

标签: php mysql datetime


【解决方案1】:

不再是狂野射击

date("Y-m-d H:i:s")

因此,您以正确的 MySQL 日期时间格式存储日期。你的显示器有时会显示

December 31, 1969

这意味着您显然是以不同的格式显示它。因此,您用于转换该日期的代码存在问题。最有可能的问题是月份先到还是天先到。查看该代码,您将看到当您的代码使用一个月的日期时发生了什么,这会导致错误,然后将打印的日期默认为 unix epoch。

您还可以通过运行查询来查看所有存储的日期时间值来验证这个假设,如果您总是使用date("Y-m-d H:i:s") 来存储日期,那么它绝对不可能损坏 em> 有时是随机的。

上次登录:从不 ;)就是答案。

【讨论】:

  • 好的,你去吧。如果用户没有上次登录值,那么您将看到 1970 年的日期。你应该在那里进行一些错误检查。例如,如果它是用户第一次登录,则没有先验值。
  • 谢谢,你是对的。原来已经注册但未登录的字段值为 null - 将添加错误检查
【解决方案2】:

如果你将一个纪元(自纪元以来的秒数)转换为一个日期,你通常会得到一个不错的合理值:

例如:

echo date('Y-m-d H:i:s', 1453266106); //2016-01-20 00:01:46

但是如果你传入0,你会得到纪元的日期:

echo date('Y-m-d H:i:s', 0); // 1969-12-31 19:00:00

检查您的代码是否有任何其他位置,您正在更新user_last_login,并将第二个(整数)参数传递给date

【讨论】:

    【解决方案3】:

    看起来您的时间有时可能无效。见Prevent PHP date() from defaulting to 12/31/1969

    您可以尝试在插入之前先检查时间(如链接所示)以防止这种情况发生。但是你仍然需要弄清楚为什么它有时是无效的。为此,您需要更好地了解时间的来源。

    【讨论】:

    • 时间来自发布的函数:date("Y-m-d H:i:s")。还是你的意思是别的?
    • 是的,date() 函数正在获取系统时间。但它来自哪里?大概它是从网络(Internet)获取的。也许您的系统时间没有得到一致的更新,并且偶尔会提供错误的值。这可能很难调试,但您可以在插入时间之前在您的 PHP 代码中检查这一点,如果需要,可能会再次调用 date() 函数。
    猜你喜欢
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-17
    • 1970-01-01
    • 2018-04-11
    相关资源
    最近更新 更多