微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

处理偏移量更改以尝试正确显示日期

如何解决处理偏移量更改以尝试正确显示日期

我正在一个项目上,我需要显示一个时间戳。我将时间保留在UTC格式的数据库中。假设我所在区域的偏移量是-4小时(并假设我处于夏令时),因此,当我在数据库中输入时间时,它会提前4个小时输入。现在是冬天,偏移量为-3小时。当我从数据库中取出信息并将其更改回标准时间时,该时间仅增加了3个小时,而不是4个小时。因此,所有项目显示的时间都比它们早了1个小时。所以我的问题是-有一种方法可以知道在信息输入到数据库的那一刻中某个区域的确切偏移量?

解决方法

由于您以UTC日期和时间开头,因此可以将Intl.DateTimeFormat constructor与选项结合使用,以获取特定IANA representative location的时区偏移。

例如

function getOffset(s,location) {
  let getTz = lang =>
    new Intl.DateTimeFormat(lang,{
      timeZone: location,timeZoneName:'short'
    }).formatToParts(new Date(s)).reduce((acc,part) => {
      if (part.type == 'timeZoneName') {
        acc.tz = part.value;
      } return acc;
    },Object.create(null)).tz;
    
  let offset = getTz('en');
  return (/\d/.test(offset)? offset : getTz('fr')).replace(/^[a-z]+/i,'');
}

let s = '2020-10-27T00:16:25.867Z';

console.log(`At ${s} the offset in these places is:`);
['America/New_York','Europe/Paris','Australia/Broken_Hill','Pacific/Apia','Pacific/Chatham'
].forEach(loc => console.log(`${loc}: ${getOffset(s,loc)}`));

请注意,如果使用的语言与主机的默认语言匹配,则会返回时区的简称。如果不匹配,则返回为UTC±H:mm或GMT±H:mm,其中仅在需要时包括分钟。因此,该函数首先尝试en,如果不起作用,则使用fr。我尚未找到en和fr都返回缩写而不是偏移量的地方。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。