如何将随机生成的日期视为 UTC 时间

How to treat a randomly generated Date as UTC time

使用 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

但最终,如果我继续生成日期,根据随机生成的值,日期对象可能会超出范围。

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"));

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

moment().tz("UTC").format("2021-02-10 23:59:59") 只是 return“2021-02-10 23:59:59”,总是。

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

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

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

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'