1

我在使用 CMS 时有点噩梦,它可以在没有时区的情况下保存日期时间。由于各种基础设施原因,我无法调整核心文件,我只能调整 CMS 字段本身的一些 javascript,而不包括外部库(或 dayjs UTC 插件)。

目前如何运作:

  1. CMS 像这样保存日期时间字符串:2020-10-29 05:00缺少时区
  2. 重新加载时,dayjs 将字符串解析2020-10-29 05:00UTC并根据浏览器区域设置更改时间。
  3. 如果您使用的浏览器不是 UTC,则显示的时间将与保存的字符串不对应

我的骇人听闻的想法:

  1. 加载字符串时,获取浏览器的时区
  2. 修改字符串2020-10-29 05:00以包含浏览器的时区,或偏移日期对象,以便在解析为“本地”时正确显示

我最初的想法只是在显示之前添加/减去偏移量,但它似乎仍然不起作用(我认为由于 getTimezoneOffset 没有针对夏令时进行调整?):

let date = new Date('2020-10-29 05:00')
console.log(new Date(date.setMinutes(date.getMinutes() + new Date().getTimezoneOffset())))

我想这个问题的另一种形式是:有没有办法解析一个UTC日期时间字符串,就好像它是本地的一样?

4

1 回答 1

0

如果字符串是 UTC,您应该将其解析为 UTC,然后在 UTC 中执行所有操作。我认为最简单的方法是使用您自己的函数或库将字符串解析为 UTC。

此外,鉴于:

new Date('2020-10-29 05:00')

某些浏览器将返回无效日期(它们将其视为支持格式YYYY-MM-DDTHH:mm:ss 的格式错误版本)。

通常,由于浏览器不一致,强烈建议不要使用内置解析器。此外,弄乱时区偏移量也会导致难以发现问题(例如,应用偏移量会导致日期跨越 DST 边界)。

一个简单的功能来完成这项工作:

function parseAsUTC(s) {
  let [y, m, d, H, M] = s.split(/\D/);
  return new Date(Date.UTC(y, m-1, d, H, M));
}

let s = '2020-10-29 05:00';
console.log(parseAsUTC(s));

于 2020-03-06T22:05:12.607 回答