如何将随机生成的日期视为 UTC 时间
How to treat a randomly generated Date as UTC time
使用 moment-random 库,我试图生成一个介于 2021-02-10 00:00:00
和 2021-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'
使用 moment-random 库,我试图生成一个介于 2021-02-10 00:00:00
和 2021-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'