【问题标题】:php time 'off' by 8 hours and 14 minutesphp 时间“关闭”8 小时 14 分钟
【发布时间】:2014-10-07 20:11:02
【问题描述】:

我有时间/日期问题。我正在尝试将当前日期和时间与一天开始(午夜)的日期/时间进行比较。 当前时间是:

echo date('d M, Y H:i:s e')."<br>";

按预期返回:“07 Oct, 2014 12:51:25 America/Los_Angeles”

然后要在今天开始的午夜获得时间,我有:

echo date('d M, Y H:i:s e',strtotime(date('D, d M, Y')))."<br>";

返回:“2014 年 10 月 7 日 20:14:00 America/Los_Angeles”

10 点(晚上 8 点)很奇怪,因为 UTC 不应该是 08:00 而不是 20:00?还有 14 分钟?

谁能帮我理解这里发生了什么?我错过了什么?

非常感谢

【问题讨论】:

  • 那行代码是 UGLY 和 POINTLESS。为什么要取今天的日期,将其格式化为非标准格式,然后将其转换为 Unix 时间戳,然后尝试将其转换为另一种格式?
  • 只需echo date('d M, Y 00:00:00 e'); 工作。

标签: php date strtotime


【解决方案1】:

date('Y-m-d H:i:s') 为您提供当前时间,而不是午夜。尝试使用下一个代码:

echo date('d M, Y H:i:s e',strtotime(date('Y-m-d 00:00:00')))."<br>";

“00:00:00”将时间设置为午夜。

你可以使用这个简单的变体:

echo date('d M, Y 00:00:00 e')

【讨论】:

    【解决方案2】:

    您正在向strtotime 函数发送一个令人困惑的日期字符串。

    如果你试试这个:

    echo date('d M, Y H:i:s e').'<br>';
    echo date('d M, Y H:i:s e',strtotime(date('Y-m-d H:i:s')))."<br>";
    

    您将获得一致的结果,因为Y-m-d H:i:s 是strtotime 使用的更好格式。

    来自docs on strtotime:

    函数期望得到一个包含英文日期格式的字符串,将尝试将该格式解析为 Unix 时间戳(自 1970 年 1 月 1 日 00:00:00 UTC 以来的秒数) ,相对于 now 中给出的时间戳,或者如果 now 未提供,则为当前时间。

    和

    为避免潜在的歧义,最好尽可能使用 ISO 8601 (YYYY-MM-DD) 日期或 DateTime::createFromFormat()

    要在午夜获得您正在寻找的时间(我不建议这种方法):

    echo date('d M, Y H:i:s e',strtotime(date('Y-m-d')))."<br>";
    

    您可以轻松地输出一个“永恒”的日期并直接在日期函数中插入一个静态00:00:00:

    echo date('d M, Y 00:00:00 e')."<br>";
    

    但我喜欢使用DateTime objects:

    $midnight = new DateTime('today');
    echo $midnight->format('d M, Y H:i:s e').'<br>';
    // Output from sandbox is: 07 Oct, 2014 00:00:00 US/Pacific<br>
    

    好的部分是您可以轻松地在本地比较它们而无需任何额外的操作:

    $now = new DateTime('now'); // 2014-10-07 12:34:56
    $midnight = new DateTime('today'); // 2014-10-07 00:00:00
    
    var_dump($now > $midnight); // true
    var_dump($now < $midnight); // false
    var_dump($now === $midnight); // false
    var_dump($now !== $midnight); // true
    

    【讨论】:

    • date('d M, Y H:i:s e',strtotime(date('Y-M-d')))."
      ";午夜时间
    • @JohnConde 我在你删除评论之前看到了你的评论,并用我喜欢的方法解决了它
    • +1,因为问题是问为什么 OPs 代码会返回一个意外的时间,这里通过文档引用解决。
    • @showdev 谢谢,我已将您对 date('d M, Y 00:00:00 e') 的评论添加到我的回答中,以确保完整性
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    • 2014-07-23
    相关资源
    最近更新 更多