我正在使用 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)
最佳答案
您给出的代码确实是获取自一天开始以来经过的分钟数的正确方法,并且结果是正确的。尽管时钟上的时间是 3:05,但实际上距离午夜仅过去了 2 小时 5 分钟,因为 2:00 到 3:00 之间的时间被跳过了。在秋季,您会产生相反的效果 - 添加一个额外小时,因为 1:00 到 2:00 之间的时间会重复。
重要的是要认识到夏令时对每个人来说都不同。许多国家根本没有这种做法,而那些有这种做法的国家也并非都在同一天或一天中的同一时间进行。例如,巴西将 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 ,其中有一些漂亮的图表可以帮助您直观地了解这一点。
关于javascript - Moment.JS 夏令时当天午夜起的分钟数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33857944/