获取当前时间的毫秒数(UTC)(不使用字符串)

31

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

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

var d = new Date();
var t_millis = d.getTime();
但这不是我想要的。我想要当前系统日期以 UTC 和毫秒为单位,所以完全不需要处理字符串。据我所知,变量 t_millis 将包含当前时间戳的毫秒值(在 GMT 中),而不是 UTC。 (因为 d 也是在 GMT 中。除非 getTime() 在输出毫秒之前执行某种隐式时区转换,即添加偏移量,但我从未在任何地方看到过。)
那么除了将偏移量添加到时间值中,真的没有其他方法吗? 我非常希望有一个像其他语言中已知的 getUTCTimeMillis() 函数。

2
我不明白。在所有意义上,UTC 就是 GMT。 - Andrew Leach
是的,UTC 就是 GMT...我应该说“本地时间”而不是“GMT”。我的错。当我说“GMT”时,我通常指的是 UTC 的相反,即由 GMT+/-offset 显示的本地时间,而我认为 UTC = 常数。 - syntaxerror
5个回答

63

虽然这是一个老问题,但为了新访客的利益,这里给出正确答案

Date.now();

它返回自1970年1月1日00:00:00 UTC以来经过的毫秒数


22

无论你处于哪个时区,一天中的毫秒值都是相同的。也就是说,在地球上没有任何两个时区的毫秒数相差大于零,它们可能以整数小时甚至分钟为单位有所不同,但不会以秒或毫秒为单位有所不同。

话虽如此,getTime()方法返回的是一个UTC相关的时间戳。假设两个Web浏览器在地球上很遥远的位置同时创建一个Date对象,它们都将从.getTime()获得相同的值(假设时钟是同步的,当然这是非常不可能的)。

这里有一个时间戳:1338585185539。我现在在德克萨斯州奥斯汀市,下午4点13分(因此该时间戳略早于这个时间)。在您的计算机上使用Date实例进行测试。

编辑 -- 为了记录,该时间戳是2012年6月1日的。)


抱歉,但我不同意这个观点。确实自1970年以来在一个时区中经过的时间与任何其他时区中的时间相同,但UTC是另一回事。为什么你要有这么多与标准Date函数并列的函数,它们都带有UTC字样呢?这里有一个解释,为什么UTC几乎与GMT相同但又有所不同: - Sandman
@Teo 嗯?UTC日期函数之所以存在,是因为非UTC API都报告相对于本地时区的时间/日期。 - Pointy
1
抱歉我的帖子不完整(我试图链接到维基百科的一段话)。是的,但有两件事我并不完全同意,希望我没有误解:getTime()是一个UTC相关的时间戳,而且在计算getTime()之前应该隐式执行GMT-to-UTC转换(或任何其他类型的转换)。 - Sandman
1
getTime() 是一个时区相关的值,而不是UTC相关的值(这就是为什么它在任何地方都是相同的),并且getTime()不进行任何转换,对吗?如果您想要跨时区进行任何类型的同步(这就是我怀疑这个问题首先被提出的原因),您需要使用通用参考UTC。如果您只想在本地时区中测量经过的时间,那么它并不重要,您可以使用getTime()。 - Sandman
@Teo getTime() 返回一个UTC时间戳值。在任何时刻,时间戳值都是相同的,无论时区如何。时间戳始终是自特定UTC时间点以来毫秒计数。 - Pointy
显示剩余6条评论

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())

只是提醒一下,你可以省略UTC部分。(例如使用now.getFullYear()而不是now.getUTCFullYear())。 - Ryan Q
1
@RyanQ 如果他这样做的话,nowutc_now 有什么区别呢?这就是重点所在。 - Odys

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之间的偏移量(以分钟为单位)。
  • offset = offset * 60000; 这个操作将分钟转换为毫秒。
  • 减去偏移量得到自1970年1月1日00:00:00 UTC以来经过的毫秒数。

getTime函数返回自1970年1月1日00:00:00以来在客户端时区经过的毫秒数。 getTimezoneOffset返回客户端时区与UTC之间的偏移量(以分钟为单位)。 offset = offset * 60000; 此操作将分钟转换为毫秒。 减去偏移量即可得到自1970年1月1日00:00:00 UTC以来经过的毫秒数。 - Blacknet
以下是针对当前浏览器的一行代码:Date.nowUTC=()=>(d=>d.getTime()-(d.getTimezoneOffset()*6e4))(new Date()) - Mr. Polywhirl
2
我认为这不正确。根据MDNgetTime()总是使用UTC进行时间表示。例如,一个客户端浏览器处于一个时区中,getTime()将与在任何其他时区中的客户端浏览器相同。此外,他们说返回值是表示从1970年1月1日00:00:00 UTC到给定日期经过的毫秒数的数字。而不是客户端时区中的毫秒数。 - Noah Allen
1
@noa 我也是这么认为的,但如果你 1)var a = new Date(); 2)a.setHours(0,0,0,0); 3)a.getTime(),它返回的时间戳不是原始日期,而是修改后的日期。我认为他们需要修复文档。 - Dmitry

3

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

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

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

它可以用于以下场景:

var date = new Date();
var timestamp = date.getUTCTime();

1
你可能想把减号改成加号 ;) 负偏移将被添加而不是减去 :) - cstruter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接