Javascript 如何将随机生成的日期视为UTC时间
使用该库,我试图生成一个介于Javascript 如何将随机生成的日期视为UTC时间,javascript,date,momentjs,utc,moment-timezone,Javascript,Date,Momentjs,Utc,Moment Timezone,使用该库,我试图生成一个介于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
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))
从上面的代码中,我可以得到以下结果(都在范围内)
但最终,如果我继续生成日期,日期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]
更新:解决方案
我只需在生成的值后面加上“Z”即可得到预期的结果,如下所示:
console.log(新日期(随机+Z”)代码>
然而,我仍然想知道这是怎么回事,以及幕后发生了什么。如果您能回复,我们将不胜感激 moment().tz(“UTC”).format(“2021-02-10 23:59:59”)
将始终返回“2021-02-10 23:59:59”
矩()
为“现在”创建一个矩,需要一组格式化标记,但上面给出的字符串不包含任何标记,因此它只返回字符串(不包含时区偏移,因此被视为本地)
您似乎希望将“2021-02-10 23:59:59”解析为UTC,因此在解析时间戳时使用,而不是在格式化时使用(因为一旦解析为本地,将其更改为UTC就太晚了):
console.log(矩.utc('2021-02-10 23:59:59').format())代码>
momentRandom(结束,开始)
接受您可以传递到moment()中的任何内容。因此,我建议传递您想要的范围内的实际日期(或时刻),而不是字符串。@HereticMonkey-我看不出使用moment.js仅将结果传递给momentRandom解析字符串有任何意义,而momentRandom将以完全相同的方式解析它。但这当然取决于OP:-)我刚刚测试了这一点,但是在format()
之前调用utc()
方法并不能解决问题,除非我在创建日期对象时保留了“Z”,例如newdate(ramdon+“Z”)
。我想这意味着momentRandom一直在转换为本地,日期构造函数需要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()
,这使它工作得更好,谢谢!
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]
2021-02-10 05:08:59
2021-02-10T05:08:59.000Z