【问题标题】:How do you create a new javascript date object for the current time in UTC?如何在 UTC 中为当前时间创建一个新的 javascript 日期对象?
【发布时间】:2021-04-02 16:37:32
【问题描述】:

我正在尝试使用倒数计时器托管一个应用程序,该计时器从未来给定的 UTC 日期和时间中减去当前的 UTC 日期和时间。但问题在于new Date()new Date(Date.now()) 等,我一直在获得几个小时的当地时间。如何使用 UTC 的当前时间创建一个新的 Date 对象?

let date = new Date()
date = date.toUTCString().slice(0, date.toUTCString().length - 13);
let time = "17:00:00"    
// this is the UTC time of the event, this works hosted
// locally this has to be "12:00:00"

const timeLeft = new Date(`${date} ${time}`) - new Date();
const hoursLeft = Math.floor((timeLeft / (1000 * 60 * 60)));
const minutesLeft = Math.ceil((timeLeft / 1000) / 60 % 60);
// I'm trying to get a consistent hoursLeft on both local and hosted machines

我可能只会使用 moment.js 来避免问题并简化代码,但我仍然很想知道答案。

【问题讨论】:

  • 使用Date.UTC?
  • Date.UTC 不起作用,因为您必须在 arg 中给它日期,Date.UTC() 是 NaN。我需要一个使用 UTC 时间的 Date.now()
  • 转换为纪元时间?转换为 GMT 字符串并从中创建日期?在不知道您的输入实际是什么的情况下(例如,如果您有一个有效的 UTC 字符串,那么这似乎是一个转换问题),很难知道具体问题是什么。
  • 输入与问题无关,new Date(date, time) 按预期工作,并且始终采用 UTC。问题出在new Date()。那个在本地提供不同的日期并托管,我希望它始终以UTC的当前时间创建新的日期。
  • 你是对的。因为答案是,new Date() is 是“UTC 当前时间的日期对象”。查看get UTC date (not UTC string) in javascript的答案

标签: javascript date


【解决方案1】:

如何为当前 UTC 时间创建一个新的 javascript 日期对象?

其中任何一个都可以做到这一点,而且只能做到这一点。

const d = new Date();

const d = new Date(Date.now());

在内部,Date 对象只存储一个值,即自1970-01-01T00:00:00.000Z(Unix 时间戳)以来的毫秒数,它以 UTC 为单位,因此Date 对象本身也以UTC,以及从new Date() 获取当前Date 对象或从Date.now() 获取当前Unix 时间戳的想法也是以UTC 为单位的。

您可能会感到困惑,因为您在将Date 对象显示为字符串时看到的是等效的本地时间,例如在看到来自console.log(d.toString()) 的输出时(或者在某些环境中只是来自console.log(d),虽然不是在都是因为这种行为是未定义的)。本地时区来自 toString 调用期间的运行时环境 - 它不存储在 Date 对象本身中。

如果您想查看 UTC 时间,请改为使用console.log(d.toISOString())toISOString 函数始终以 ISO 8601 格式显示 UTC 日期和时间。

【讨论】:

    【解决方案2】:

    这样做:

    var i=new Date();
    var d = new Date(i.getUTCFullYear(), i.getUTCMonth(), i.getUTCDate(), i.getUTCHours(), i.getUTCMinutes(), i.getUTCSeconds());
    

    以UTC的当前时间创建一个新的Date对象。

    更新
    这也有效:

      var d = new Date();
      var n = d.toUTCString();
    

    【讨论】:

    • 这会创建一个日期对象在当前时区,其值与当前UTC 时间的值相同。但是,日期将遵守当前时区的任何 DST 规则(因此,如果当前时间处于“非小时”中,某些时区在向前跳时会显示错误的时间),并且使用 getTimezoneOffset() 将显示 0 以外的值(除非当前时区是 UTC 或偏移量是 UTC+00:00)。
    • @HereticMonkey 我仍在努力弄清楚原因,但此解决方案适用于本地和远程托管版本的应用程序。
    • 这种方法几乎不应该使用。您已经更改了 Date 对象的含义。如果这对您有用,那么您做错了什么else,例如您如何使用结果对象来解释函数的输出。也许您的计算机或服务器上的时钟和/或时区设置不正确。
    • 使用d.setMinutes(d.getMinutes() + d.getTimezoneOffset()) 可以获得完全相同的结果,即它将日期的时间值移动适用的时区偏移量,因此 local 值与之前的值相同UTC 值。
    猜你喜欢
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-06
    • 1970-01-01
    • 1970-01-01
    • 2012-06-14
    • 2013-02-21
    相关资源
    最近更新 更多