javascript - 处理偏移量变化以尝试正确显示日期
问题描述
我正在做一个项目,我需要显示一个时间戳。我将时间保存在 UTC 格式的数据库中。假设我所在地区的偏移量是 -4 小时(假设我处于夏令时),所以当我将时间输入数据库时,它会提前 4 小时输入。现在是冬天,偏移量是 -3 小时。当我将信息从数据库中拉回并将其更改回标准时间时,时间只增加了 3 小时——而不是 4 小时。因此,所有项目的显示时间都比应有的时间早了一小时。所以我的问题是 -有一种方法可以知道某个区域的确切偏移量,即信息输入数据库的那一刻?
解决方案
由于您从 UTC 日期和时间开始,您可以使用Intl.DateTimeFormat构造函数和选项来获取特定IANA 代表位置的时区偏移量。
例如
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 返回缩写而不是偏移量的位置。
推荐阅读
- python - 如何在 Qt 中设置按钮背景颜色,甚至覆盖平台主题?
- python - 仅当值是类型时才分配的语法糖
- python - 不同的答案与缺失值的插补
- read-the-docs - 阅读用于 setup.py 安装的文档配置
- swift - 除非我在需要之前调用它一次,否则函数不会返回 true
- .htaccess - 标头集 X-Frame-Options “SAMEORIGIN”不适用于 URL 缩短器 CTA 按钮
- arduino - 继电器启动但不关闭
- c++ - 为什么从 DWORD 中提取 lo 和 hi 字时需要二进制移位?
- python - 使用 pyodbc 删除行冻结并且不删除行
- node.js - 我可以在谷歌云功能上托管 nodejs GRPC 服务器吗?