Javascript-显示日期时间并忽略语言环境/时区

时间:2020-03-06 12:41:34

标签: javascript datetime dayjs

我在使用CMS时遇到了噩梦,该CMS可以节省没有时区的日期时间。由于各种基础结构原因,我无法调整核心文件,我只能调整CMS字段本身的一些JavaScript,而不能包含外部库(或dayjs UTC插件)。< / p>

当前工作方式:

  1. CMS像这样保存日期时间字符串:2020-10-29 05:00,它缺少时区
  2. 重新加载时,dayjs将字符串2020-10-29 05:00解析为UTC,并根据浏览器的语言环境更改时间。
  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日期时间字符串解析为本地字符串?

1 个答案:

答案 0 :(得分:0)

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

还给出:

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

某些浏览器将返回无效的日期(它们将其视为supported format 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));