【问题标题】:Javascript - Display date time and ignore locale/timezoneJavascript - 显示日期时间并忽略语言环境/时区
【发布时间】:2020-06-19 04:53:19
【问题描述】:

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

目前的运作方式:

  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 日期时间字符串?

【问题讨论】:

  • getTimezoneOffset 将 DST 考虑在内。但是使用new Date().getTimezoneOffset(),您将看到与今天日期的偏移量 - 这可能与实际适用于您的日期的偏移量不同。
  • 嗨@CBroe,谢谢,但我认为这并不重要,因为我只想让时间完全按照它的外观显示,而不需要针对浏览器的区域设置进行本地化/调整。
  • 当然,当您想通过考虑本地时区偏移来解析日期时,这很重要。在使用 DST 的国家/地区,当地时区偏移量将不同,具体取决于您的日期是在夏令时还是冬令时。
  • 对不起,我的意思是(如果我仍然误解,请纠正我),我只是获取当前时区偏移量,并尝试将其添加到日期(例如:getTimezoneOffset() 说我们是提前 60 分钟,所以从时间和显示中删除 60 分钟 - 应该等于原始时间,不是吗?)

标签: javascript datetime dayjs


【解决方案1】:

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

另外,给定:

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

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

【讨论】:

  • 谢谢,关于浏览器不一致的问题完全正确。这很有帮助并且非常接近,但我想问题是我需要解析输入字符串,就好像它是本地的,而不是 UTC(以避免在显示时进行任何转换) - 这将类似于:始终显示 2020-10-29 05:00无论浏览器区域设置如何。在此解决方案中,日期对象在德国转换为 Date Thu Oct 29 2020 06:00:00 GMT+0100 (Central European Standard Time) 并显示为一小时后。
  • 只是为了进一步澄清-令人沮丧的是,CMS总是将给定的日期对象解析为UTC(即使它以某种方式忽略了给定对象的时区)。因此,无论提供什么,它都会根据浏览器的区域设置添加或删除小时数。所以我的目标是向它传递一个日期对象,以相应地补偿浏览器的语言环境。
  • @waffl — 日期对象没有时区,它们本质上是 UTC。仅在解析字符串以创建 Date 对象以及从非 UTC get*set*获取和设置值时才考虑主机系统设置(不恰当地命名为“locale”) > 方法。如果您总是希望无论设置如何都显示相同的日期和时间,那么请以 UTC 执行所有操作。
猜你喜欢
  • 1970-01-01
  • 2022-01-07
  • 2020-07-10
  • 1970-01-01
  • 1970-01-01
  • 2011-09-15
  • 1970-01-01
  • 2015-04-20
  • 2010-09-10
相关资源
最近更新 更多