在Daylight节日当天从Moment.JS午夜开始

时间:2015-11-22 17:39:49

标签: javascript momentjs dst

我正在使用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)

1 个答案:

答案 0 :(得分:2)

您提供的代码确实是获取自当天开始以来经过的分钟数的正确方法,结果是正确的。即使时间是3:05,实际上从午夜开始只有2小时5分钟,因为跳过了凌晨2点到3点之间的小时。在秋季,您会产生相反的效果 - 添加额外小时,重复1:00到2:00之间的小时。

重要的是要意识到DST对每个人来说并不相同。许多国家根本没有它,而那些拥有它的国家并非都在同一天或同一时间都这样做。例如,巴西在十月份向前推进,从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,其中有一些很好的图表可帮助您将其可视化。

相关问题