我正在尝试获取一个字符串日期YYYY-MM-DD,并将其粘贴到一个日期对象中以使用matDatePicker。问题是它显示了昨天的日期。我做了一些挖掘,发现问题是Date将对象存储为UTC,然后转换为当前时区。
我会完全跳过使用日期,除非我想使用matDatePicker。然而,因为日期只在前端加载,所以以后它是否准确并不重要(它没有保存为日期时间,这让我很懊恼(。如何加载带有年月日的Date对象并将其设置为用户当前时区?我不控制用户将在哪个时区,所以我正在寻找与时区无关的东西(即,我不能一直添加6个小时(。
如果您试图转换格式为YYYY-MM-DD
的日期,您从哪里获得用户的时区?ISO字符串通常在字符串末尾包含+0000
,其中最后部分是时区。不管怎样,我猜你实际上有一个ISO字符串。
问题是,当您解析Date对象时,它希望将时间转换为相对于本地时间的时间。当您使用UTC时间时,它会删除用户时区。
因此,我们可以做的是为用户获取初始日期时间。
let s = "2022-03-21T11:22:33+0000";
let d = new Date(Date.parse(s));
// Methods on Date Object will convert from UTC to users timezone
// Set minutes to current minutes (UTC) + User local time UTC offset
d.setMinutes(d.getMinutes() + d.getTimezoneOffset())
// Now we can use methods on the date obj without the timezone conversion
// my local time is: "2022-03-21T07:22:33.000Z"
console.log(d) // "2022-03-21T09:22:33.000Z"