【问题标题】:Getting the exact number of minutes of a given date获取给定日期的确切分钟数
【发布时间】:2017-02-24 03:43:20
【问题描述】:

正常情况下,正常一天有 1440 分钟(60 分钟/小时 * 24 小时)。但是,由于夏令时,可能有 1380 分钟(60 分钟/小时 * 23 小时)或 1500 分钟(60 分钟/小时 * 25 小时)。

当提供 php 的 DateTime 对象时,如何找到给定日期的确切分钟数?

例如,2016 年 3 月 13 日,DST 在美国开始(因此是一天 23 小时),而 2016 年 11 月 6 日,DST 在美国结束(因此是一天 25 小时)。 2016 年 5 月 1 日是一个正常的 24 小时日。我想要一个返回以下内容的函数:

$lomg= new DateTime('November 6, 2016T07:23:11');
$short= new DateTime('March 13, 2016T19:17:53');
$regular = new DateTime('May 1, 2016T22:45:00');

getMinutes($short); // Returns 1380
getMinutes($long); // Returns 1500
getMinutes($regular); // Returns 1440

【问题讨论】:

  • 如果可以避免使用 unix 时间戳,那就不要使用它们了,因为它们都是基于 UTC 的;并开始使用实际上是时区感知的 DateTime 对象
  • 使用 (bool)$dateTimeObject->format('I') 可以知道 DST 当前是否生效。
  • unix 时间戳不包含任何时区数据。它是 UTC,没有 DST 设置。您应该在内部将时间(例如使用 php 中的 DateTime() 和 DateTimeZone() 类)转换为正确的时区,它会根据日期自动调整 DST 和时区偏移量。
  • DST starts in the US (and thus is a 25 hour day) - 呃,不,它是一天 23 小时:print (strtotime('14 March 2016')-strtotime('13 March 2016'))/3600(在正确设置您的时区之后)。而且你混淆了基准和区间。
  • 你们都是对的,我把我原来的问题搞砸了。我确实在使用 DateTime 对象而不是时间戳。我相应地编辑了我的问题。很抱歉造成混乱。

标签: php datetime dst


【解决方案1】:

以下应该(原则上)起作用:

<?php


$dt = new DateTime();    
$dt->setTimestamp(1457827200);    
$dt->modify("today"); //Set to 00:00:00
$dt2 = clone $dt;     // Copy to new instance
$dt2->modify("+1 day");

var_dump(($dt2->getTimestamp() - $dt->getTimestamp())/60);

(完全免责声明,未测试)

【讨论】:

    猜你喜欢
    • 2012-06-24
    • 1970-01-01
    • 2014-01-12
    • 1970-01-01
    • 1970-01-01
    • 2018-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多