【问题标题】:Getting current date in milliseconds (UTC) (NO use of strings)以毫秒 (UTC) 为单位获取当前日期(不使用字符串)
【发布时间】:2012-06-07 02:34:55
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 我不明白。 UTC GMT,无论出于何种目的和目的。
  • 是的 UTC 是 GMT...我应该说“当地时间”。我的错。当我指的是“GMT”时,我通常指的是 UTC 的反义词,即。 e. GMT+/-offset 显示的当地时间,而我认为 UTC = 常量。

标签: javascript date utc milliseconds


【解决方案1】:

这是一个老问题,但为了这里的新访客,正确答案

Date.now();

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

【讨论】:

    【解决方案2】:

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

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

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

    它可以用于:

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

    【讨论】:

    • 您可能想要将减号更改为加号;)将添加负偏移量而不是减去 :)
    【解决方案3】:

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

    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;此操作以毫秒为单位转换分钟。
    • 减去偏移量得到从 1 开始经过的毫秒数 1970 年 1 月 00:00:00 UTC。

    【讨论】:

    • getTime 函数返回客户端时区自 1970 年 1 月 1 日 00:00:00 以来经过的毫秒数。 getTimezoneOffset 返回客户端时区和 UTC 之间的偏移量(以分钟为单位)。偏移量 = 偏移量 * 60000;此操作以毫秒为单位转换分钟。减去偏移量得到自 1970 年 1 月 1 日 00:00:00 UTC 以来经过的毫秒数。
    • 这是当前浏览器的单行代码:Date.nowUTC=()=>(d=>d.getTime()-(d.getTimezoneOffset()*6e4))(new Date())
    • 我不认为这是正确的。根据MDNgetTime() always uses UTC for time representation. For example, a client browser in one timezone, getTime() will be the same as a client browser in any other timezone.。此外,他们说返回值是A number representing the milliseconds elapsed between 1 January 1970 00:00:00 UTC and the given date. 不是客户端时区的毫秒数。
    • @noa 我也这么认为,但如果你 1) var a = new Date(); 2) a.setHours(0,0,0,0); 3) a.getTime(), - 它返回的时间戳不是原始日期,而是修改后的日期。我认为他们需要修复文档
    【解决方案4】:

    怎么样:

    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 部分。 (IE now.getFullYear() 而不是 now.getUTCFullYear() )。
    • @RyanQ 如果他这样做,nowutc_now 之间有什么区别?这就是重点。
    【解决方案5】:

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

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

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

    edit——为了后代,时间戳是从 2012 年 6 月 1 日开始的。)

    【讨论】:

    • 谢谢!是的,我现在明白了。因此,如果我们确定 Date 对象肯定是 GMT 值,我们可以从逻辑上得出结论,getTime() 必须在 计算毫秒之前悄悄地执行 GMT 到 UTC 的转换。
    • 对不起,我不同意这一点。事实上,一个时区自 1970 年以来经过的时间与任何其他时区的时间相同,但 UTC 是另一回事。为什么会有这么多与名称中包含 UTC 的标准 Date 函数平行的函数?以下是为什么 UTC 与 GMT 几乎相同但不完全一样的解释:
    • @Teo 嗯? UTC 日期函数在那里是因为非 UTC API 都报告相对于本地时区的时间/日期。
    • 抱歉我的帖子不完整(我试图链接到维基百科的段落)。是的,但有两件事我并不真正同意,希望我没有误解:getTime() 是相对于 UTC 的时间戳,而 GMT 到 UTC 的转换(或任何类型的转换)应该是隐式的在计算 getTime() 之前执行
    • getTime() 是一个时区相对值,而不是 UTC 相对值(这就是为什么它在所有地方都相同),并且 getTime() 不会进行任何转换,对吧?如果您想要跨时区的任何类型的同步(这就是为什么我首先怀疑这个问题被问到),您将需要通用参考,即 UTC。如果您只想测量本地时区的经过时间,那么这并不重要,您可以使用 getTime()
    猜你喜欢
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 2020-12-17
    • 1970-01-01
    • 2012-01-15
    相关资源
    最近更新 更多