【问题标题】:Minutes from midnight in Moment.JS on day of Daylight Savings夏令时当天 Moment.JS 中从午夜开始的分钟数
【发布时间】:2016-02-24 18:52:02
【问题描述】:

我正在使用 Moment.js 库,我试图获取给定时间戳自午夜以来经过的分钟数。它运行良好,除了在日光节约发生的日子(等 2015 年 3 月 8 日)。

如何准确获取一年中所有日子自午夜以来的分钟数?我必须获取时区或偏移量吗?

http://jsfiddle.net/0uvz61xo/1/

Javascript

$(document).ready(function () {

    var minutesFromMidnight = moment("2015-03-08 03:05:00").diff(moment("2015-03-08").startOf('day'), 'minutes')
    $('#minutes').text(minutesFromMidnight);

});

HTML

Actual Minutes: <div id="minutes" style="font-weight: bold; color: red;"></div>
<br />
Expected Minutes: <b>185</b> (3 hours and 5 minutes after midnight)

【问题讨论】:

    标签: javascript momentjs dst


    【解决方案1】:

    您提供的代码确实是获取自一天开始以来经过的分钟数的正确方法,并且结果是正确的。尽管时钟上的时间是 3:05,但实际上距离午夜只过去了 2 小时 5 分钟,因为跳过了 2:00 和 3:00 之间的时间。在秋季,您会得到相反的效果 - 增加了一个 额外 小时,因为 1:00 和 2:00 之间的时间会重复。

    重要的是要意识到 DST 对每个人都不尽相同。许多国家根本没有它,而那些拥有它的国家也并非都在同一天或一天​​中的同一时间进行。例如,巴西在 10 月向前跳并从 00:00 到 01:00 跳过该小时。所以那天午夜不存在。当天的开始时间是当天的 1:00。希望这可以帮助您理解为什么从午夜开始经过的时间不一定等于时钟上的小时和分钟值。如果午夜不存在,则问题无效,即使存在也不能解释可能的不连续性。

    也就是说,如果您确实需要将时间值作为原始分钟数,那么很容易得到:

    var m = moment("2015-03-08 03:05:00");
    var result = m.hour() * 60 + m.minute();
    

    但请记住,这不是自午夜以来经过的时间。

    还要认识到,如果您在美国有类似 2015-11-01 01:30:00 的值,那是在回退过渡期间,因此有 两个 的 1:30 实例。首先是 1:30 日光时间,然后一个小时后是 1:30 标准时间。您可以计算 90 作为这次的结果,但这绝不会告诉您它是两个实例中的哪一个。同样,它不一定是午夜后的 90 分钟。它可能是,或者如果它是凌晨 1:30 的第二次出现,它可能是自午夜以来的 150 分钟。

    另请参阅the DST tag wiki,它有一些很好的图表可以帮助您将其可视化。

    【讨论】:

      猜你喜欢
      • 2020-02-05
      • 2014-09-27
      • 1970-01-01
      • 2012-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-02
      • 2015-04-01
      相关资源
      最近更新 更多