23

好吧,你可能认为这个问题已经被问过了,但我认为它还没有。我读过的所有解决方案都有这种“拼图”技术(如getUTCMonth() + getUTCMinutes + ...)。但是因为我只想比较两个 UTC (!) 日期之间经过的秒数,所以这不适用。

众所周知,您可以通过以下方式获取当前(非 UTC)日期:

var d = new Date();
var t_millis = d.getTime();

但这不是我想要的。我希望以 UTC毫秒为单位获得当前系统日期,所以根本不要乱用字符串。AFAIK 该变量t_millis将包含 GMT 中当前时间戳的毫秒值,而不是 UTC。(因为d也是在格林威治标准时间。除非getTime() 进行某种隐式时区转换,即在给出毫秒之前添加偏移量,但我从未在任何地方读到过)

那么除了将偏移量添加到时间值之外,真的没有其他方法了吗?我非常想念getUTCTimeMillis()其他语言中已知的功能。

4

5 回答 5

50

This is an old question but for the sake of the new visitors here is THE CORRECT ANSWER:

Date.now();

It returns the number of milliseconds elapsed since 1 January 1970 00:00:00 UTC

于 2015-12-06T02:09:12.083 回答
19

无论您所在的时区如何,时间的毫秒值都将是相同的。也就是说,地球上没有任何时区彼此相差大于零的毫秒数。(它们可能相差整数小时甚至分钟,但不是秒或毫秒。)

也就是说,您返回的值getTime() 相对于 UTC 的时间戳。如果地球上不同地点的两个 Web 浏览器同时创建一个 Date 对象,它们都会从中获得相同的值.getTime()(假设时钟是同步的,这当然是极不可能的)。

这里:1338585185539 ​​这是我刚刚从浏览器获得的时间戳。我在德克萨斯州的奥斯汀,现在是下午 4 点 13 分(所以时间戳会稍微早一点)。将其插入您机器上的 Date 实例中,然后查看它的内容。

编辑——为了后代的缘故,那个时间戳是从 2012 年 6 月 1 日开始的。)

于 2012-06-01T21:09:10.007 回答
7

怎么样:

var now = new Date();
var utc_now = new Date(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(),  now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds(), now.getUTCMilliseconds());
console.log('UTC: ' + utc_now) // correct UTC time but wrong timezone!
console.log('UTC (in ms): ' + utc_now.getTime())
于 2013-01-03T17:12:25.357 回答
6

我已经使用这个功能来解决这个问题。

function getUTCNow()
{
    var now = new Date();
    var time = now.getTime();
    var offset = now.getTimezoneOffset();
    offset = offset * 60000;
    return time - offset;
}
  • getTime 函数返回自客户端时区 1970 年 1 月 1 日 00:00:00 以来经过的毫秒数。
  • getTimezoneOffset 以分钟为单位返回客户端时区和 UTC 之间的偏移量。
  • 偏移量 = 偏移量 * 60000;此操作以毫秒为单位转换分钟。
  • 减去偏移量得到自 1970 年 1 月 1 日 00:00:00 UTC 以来经过的毫秒数。
于 2015-12-09T15:23:44.323 回答
2

要从 UTC 日期获取时间戳,您需要考虑该日期的时区和夏令时。例如,1 月或 7 月的日期可能意味着 1 小时的差异。

下面的选项就是这样做的。

Date.prototype.getUTCTime = function () {
    return this.getTime() - (this.getTimezoneOffset() * 60000);
};

它可以用于:

var date = new Date();
var timestamp = date.getUTCTime();
于 2017-08-02T23:31:11.110 回答