Php 是什么导致MySQL时间戳等于1969年12月31日

Php 是什么导致MySQL时间戳等于1969年12月31日,php,mysql,datetime,Php,Mysql,Datetime,在一个PHP站点中,我运行的users表有一个名为user\u last\u login的datetime字段 我不时注意到,对于随机用户,该字段的值为1969年12月31日,而数千名其他用户仍然存储了准确的日期 以下PHP代码用于在登录时生成此值: $login_success_query->bindValue(':user_last_login', date("Y-m-d H:i:s"), PDO::PARAM_STR); 什么可能会导致此意外的默认日期值 编辑(显示代码): 看起来

在一个PHP站点中,我运行的users表有一个名为user\u last\u login的datetime字段

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

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

$login_success_query->bindValue(':user_last_login', date("Y-m-d H:i:s"), PDO::PARAM_STR);
什么可能会导致此意外的默认日期值

编辑(显示代码):


看起来你的时间可能偶尔无效。看

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

如果您将历元(自历元起的秒数)转换为日期,通常会得到一个合理的值:

例如:

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

检查您的代码中是否有任何其他位置,在这些位置您正在更新
用户上次登录
,并将第二个(整数)参数传递给
日期
不再是一个通配符

date("Y-m-d H:i:s")
因此,您正在以正确的MySQL日期时间格式存储日期。你的显示器有时会显示

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

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


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

时间来自函数posted:date(“Y-m-d H:i:s”)。或者你的意思是其他的吗?是的,date()函数获取系统时间。但是它是从哪里来的呢?大概是从网络(互联网)上获得的。也许您的系统时间没有得到一致的更新,并且偶尔会提供错误的值。这可能很难调试,但是在插入时间之前,您可以在PHP代码中检查这一点,如果需要,还可以重新调用date()函数。让我们看看显示此存储日期的代码,就这样吧。如果用户没有上次登录值,那么您将看到该日期。你应该把一些错误检查放在那里。例如,如果这是用户的第一次登录,则没有优先值。谢谢,您是正确的。对于已注册但未登录的用户,字段值为空-将添加错误检查
December 31, 1969