PHP:为什么strtotime()返回“NOW()”?

4
我正在对格式化的日期时间字符串调用strtotime(),但不知何故它总是返回NOW()...

如果我的格式化日期时间字符串(存储在last_seen属性中)是:2013-06-13 07:13:04

我编写以下代码:

echo $user->last_seen;
echo date('F j, Y', strtotime($user->last_seen));

我得到的输出是:
NOW() January 1, 1970

这到底是怎么回事???这绝对不是预期的结果。该字符串存储在MySQL数据库中,如果有任何区别,请告知。

编辑:按照要求,用于在数据库中创建属性的代码如下:

$user->last_seen = date('Y-m-d H:i:s');
$user->save;

编辑2:根据要求,用于提取所需用户表的代码如下:

$user = User::find($user_id);
编辑3:如果我var_dump($user->last_seen),结果将是:
object(Laravel\Database\Expression)#40 (1) { ["value":protected]=> string(5) "NOW()" }

编辑 4: 如果我打印出 var_dump(strtotime($user->last_seen)) 的结果是:

bool(false)

编辑5:这个问题是由于我太蠢了导致的,但是所有发帖者都进行了精细的调试。如果您感兴趣,请阅读答案。


2
你从哪里获取对象 $user?负责设置其字段 last_seen 的代码是什么样子的? - Hauke P.
2
显然,您在数据库中存储了字符串“NOW()”,而不是日期,并且您从$user->last_seen获取该字符串。 - nos
@nos 当我检查数据库时,奇怪的是它显示了正确的字符串,而不是 NOW()。如果有关系,该属性是一个 datetime - wnajar
1
$user->last_seen 是什么?将其输出并且我认为你会发现它是 Now() - Toby Allen
好的...这可能很蠢,但现在我该如何将它变成对应正确时间的字符串,而不是 NOW()?这就是问题所在... :/ 呜呜。 - wnajar
显示剩余8条评论
3个回答

4

首先,您需要检查strtotime($user->last_seen)的返回值

如果strtotime($user->last_seen)返回false,那么$user->last_seen可能为空或不是有效的日期和时间格式

var_dump(strtotime($user->last_seen))

strtotime($user->last_seen) 返回的是 NOW(),而不是 false。 - wnajar
@wnajar 你有检查过 var_dump(strtotime($user->last_seen)) 吗? - som
刚刚更新了主贴,它返回“bool(false)”这个值。这看起来更有帮助... - wnajar
我想通了,检查一下我刚刚提交的答案,然后开心地笑一笑。哦天啊... - wnajar
1
$user->last_seen 包含字符串 now()。当然,strtotime('now()') 返回 false... 你的问题就像我在答案中提到的那样,是因为 $user->last_seen 包含字符串 now() - nl-x
显示剩余3条评论

1
你的问题很可能不在选择子句中,而是在存储数据的地方。当你将时间插入数据库时,你可能正在做以下操作:
insert into myTable (fieldname) values ('now()');

替代

insert into myTable (fieldname) values (now());

所以你需要去掉引号...

你没有将时间存储在数据库中,而是字符串now()...

实际上最好的做法是将数据库列类型从varchar更改为DateTime,这样甚至数据库都知道它是一个DateTime。然后你就避免了在PHP中强制将其转换回DateTime。


但这不是我所做的。我插入时间的方式是:$user->last_seen = date('Y-m-d H:i:s'); 当我手动检查数据库时,确实存储了一个字符串?我可以通过原始SQL语句找出框架的操作,但那将是框架的错误。 - wnajar
不知道,你需要展示更多的代码来排除这个问题。虽然我认为框架应该能够处理像DateTime这样的简单问题。也许你告诉你的框架该字段是DateTime,但实际上它是一个Varchar?我不熟悉Laravel... - nl-x
我想通了...感觉有点傻。看看我的答案。 - wnajar
此外,数据库列类型已经是 DateTime,这很好。 - wnajar
1
当你解决了问题,并且 var_dump($user->last_seen) 在 PHP 中也显示为 DateTime 对象(你的框架应该为你完成此操作),你可以跳过使用 strtotime()date(),直接使用 $user->last_seen->format('F j, Y'); - nl-x

1

哦,天啊... 我会为这个后悔的。我在整个项目中使用了Ctrl+F查找last_seen,然后我发现在我的路由方案中有这样的代码:

Route::filter('before', function() {
    if (Auth::check()) {
        $user = Auth::user();
        $user->last_seen = DB::raw('NOW()');
        $user->save();
    }
});

走开,尾巴夹在腿中间...

这基本上就是我在回答中所说的...但有一点不同。只是引用一下:你的问题很可能不在选择子句中,而是在你存储数据的地方。 - nl-x
我会给你这个功劳,只是在最后加上免责声明,说明最初的问题是由于我的愚蠢导致的。非常感谢大家的帮助,有时候一点点愚蠢也能走得很远! - wnajar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接