【问题标题】:PHP: why is strtotime() returning "NOW()"?PHP:为什么 strtotime() 返回“NOW()”?
【发布时间】:2013-06-09 11:56:37
【问题描述】:

我在格式化的日期时间字符串上调用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:这个问题是我是个白痴造成的,但是发帖的每个人都做了一些很好的调试。如果您有兴趣,请阅读答案。

【问题讨论】:

  • 你从哪里得到对象$user?负责设置的代码是什么样的字段last_seen
  • $user 对象是使用 MVC 框架中的对象关系映射器 (ORM) 从数据库中提取的。我将使用用于设置它的代码编辑帖子。
  • 显然您已将字符串 'NOW()' 存储在数据库中而不是日期中,并且您从 $user->last_seen 获取该字符串
  • @nos 当我检查数据库时,奇怪的是它显示了正确的字符串,而不是NOW()。如果重要的话,该属性是datetime
  • 什么是`$user->last_seen`?回显出来,我想你会发现它是 Now()

标签: php mysql date datetime


【解决方案1】:

首先你检查strtotime($user->last_seen)的返回值

如果strtotime($user->last_seen) 返回false,则$user->last_seen 可能为空或无效Date and Time Formats

var_dump(strtotime($user->last_seen))

【讨论】:

  • strtotime($user->last_seen) 返回NOW(),不是假的。
  • 现在做var_dump()
  • @wnajar 你检查过var_dump(strtotime($user->last_seen)) 吗?
  • 刚刚更新了主帖,返回bool(false)。这似乎更有帮助...
  • $user->last_seen 包含字符串 now()。当然strtotime('now()') 返回错误...您的问题是,正如我在回答中提到的那样,$user->last_seen 包含字符串now()
【解决方案2】:

您的问题很可能不在 select 子句中,而在于您存储数据的地方。

当你在数据库中插入时间时,你可能正在做

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

而不是

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

所以你需要在那里丢失引号......

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

您实际上可以做的最好的事情是将数据库列类型从varchar 更改为DateTime,这样即使数据库也知道它是一个日期时间。然后您就不必在 PHP 中将其强制转换回 DateTime。

【讨论】:

  • 那不是我做的。我插入时间的方式是:$user->last_seen = date('Y-m-d H:i:s'); 当我手动检查数据库时.. 那里确实存储了一个字符串?我可以在原始 SQL 语句中找出框架的作用,但那将是框架的一个错误。
  • 不知道,您必须向我们展示更多代码才能排除这种情况。虽然我认为该框架应该能够处理像 DateTime 这样愚蠢的事情。 ...也许您告诉您的框架该字段是 DateTime,而实际上它是 Varchar ?我不熟悉 Laravel...
  • 我想通了......感觉很愚蠢。看我的回答。
  • 另外,数据库列类型已经是DateTime了,没关系。
  • 当你解决了你的问题,并且 var_dump($user->last_seen) 显示它也是 PHP 中的 DateTime 对象(你的框架应该为你做这件事),你可以跳过使用 strtotime()date() ,简单做$user->last_seen->format('F j, Y');
【解决方案3】:

哦,天哪....我要为这个而踢自己。我为last_seen 做了一个项目范围Ctrl+F,我发现在我的路由方案中我有这个:

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

夹着尾巴走开……

【讨论】:

  • 这就是我在回答中所说的内容......但有点扭曲。引用:Your problem is most likely not in the select clause, but lays there where you store your data.
  • 我会感谢你的,只需在最后添加免责声明,即是我愚蠢导致了最初的问题。谢谢大家的帮助,一点点的愚蠢都会有很长的路要走!
猜你喜欢
  • 1970-01-01
  • 2016-02-16
  • 1970-01-01
  • 2014-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-20
  • 1970-01-01
相关资源
最近更新 更多