【问题标题】:How to treat a randomly generated Date as UTC time如何将随机生成的日期视为 UTC 时间
【发布时间】:2021-06-18 13:59:15
【问题描述】:

使用moment-random 库,我试图在2021-02-10 00:00:002021-02-10 23:59:59 之间生成一个日期,然后创建一个Date 对象。

虽然我仍在尝试了解它在内部是如何工作的,但我认为它在创建 Date obj 之前使用了我的本地时区,这导致 Date 对象超出了我指定的范围。

例子:

let random = momentRandom(
  moment().tz("UTC").format("2021-02-10 23:59:59"),
  moment().tz("UTC").format("2021-02-10 00:00:00")
).format("YYYY-MM-DD HH:mm:ss");
console.log(random);
console.log(new Date(random))

从上面的代码,我可以得到如下结果(都在范围内)

2021-02-10 16:30:38
2021-02-10T21:30:38.000Z
2021-02-10 05:08:59
2021-02-10T10:08:59.000Z

但最终,如果我继续生成日期,则日期 obj 可能会超出基于随机生成的值的范围。

2021-02-10 21:54:58
2021-02-11T02:54:58.000Z <-- outside the range [2021-02-10 00:00:00, 2021-02-10 23:59:59]

无论如何我可以将随机值用作 UTC 并让Date 构造函数将其视为 UTC?谢谢

例如,期望的输出:

2021-02-10 05:08:59
2021-02-10T05:08:59.000Z

更新:解决方案

我可以通过将“Z”附加到生成的值来获得我期望的结果:

console.log(new Date(random + "Z"));

但是,我仍然想知道它的作用以及幕后发生的事情。仍将不胜感激!

【问题讨论】:

    标签: javascript date momentjs utc moment-timezone


    【解决方案1】:

    moment().tz("UTC").format("2021-02-10 23:59:59") 总是会返回“2021-02-10 23:59:59”。

    moment() 为“现在”创建一个时刻,format 需要一组格式化标记,但上面给它一个不包含标记的字符串,所以它只返回字符串(它不包含时区偏移量,所以是被视为本地)。

    您似乎想要做的是将“2021-02-10 23:59:59”解析为UTC,因此在解析时间戳时使用utc method,而不是在格式化时(因为一旦它被解析为本地,它就是为时已晚,无法将其更改为 UTC):

    console.log( moment.utc('2021-02-10 23:59:59').format() );
    &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"&gt;&lt;/script&gt;

    format 的默认输出是 ISO 8601,因此您无需提供任何标记,您的表达式可以是:

    let ramdon = momentRandom(
      moment.utc("2021-02-10 23:59:59").format(),
      moment.utc("2021-02-10 00:00:00").format()
    ).format("YYYY-MM-DD HH:mm:ss");
    

    但是,当简单的字符串操作将产生完全相同的结果时,将“2021-02-10 23:59:59”更改为“2021-02-10T23:59:59Z”似乎是一种冗长的方式:

    "2021-02-10 23:59:59".replace(' ','T') + 'Z'
    

    【讨论】:

    • momentRandom(end, start) 将您可以传递的任何内容输入moment()。所以我建议传递你想要的范围内的实际日期(或时刻),而不是字符串。
    • @HereticMonkey——我没有看到使用 moment.js 解析字符串的任何意义,只是将结果传递给 momentRandom,当 momentRandom 将以完全相同的方式解析它。但这当然取决于OP。 :-)
    • 我刚刚对此进行了测试,但在format() 之前调用utc() 方法并不能解决问题,除非我在创建日期对象时保留'Z',例如new Date(ramdon + "Z")。我想这意味着 momentRandom 不断转换为本地,并且 Date 构造函数需要 Z 来理解我想将 random 视为 UTC?
    • @chris—new Date(ramdon + "Z") 在某些实现中会产生无效的日期,不要使用它,“T”很重要。 moment.utc("2021-02-10 23:59:59").format() 生成“2021-02-10T23:59:59Z”,moment.js(和内置解析器)将其解析为 UTC。如果 momentRandom 未将其视为 UTC,则您的问题在其他地方。
    • @HereticMonkey 是的,我也确实用toDate() 替换了format(),这使它工作得更好,谢谢!
    猜你喜欢
    • 2013-02-05
    • 1970-01-01
    • 1970-01-01
    • 2013-06-20
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    • 2018-01-11
    • 1970-01-01
    相关资源
    最近更新 更多