繁体   English   中英

如何在给定任何时区和小时的情况下获取 UTC 时间(考虑夏令时)

[英]How to get the UTC time given any timezone and hour (considering daylight savings)

例如,CST 上午 9 点(中部标准时间)或 CET 上午 6 点(中欧时间)。

使用任何新的 Date() 调用将始终给我一个本地时区(BST 或 GMT+1)的日期。

我想我需要先在所需的时区创建日期,不是吗?

function convertToUTC(date, tzString) {
   // some code?  
}

let resp = convertToUTC("2022-07-12 09:00:00", "America/Chicago");

console.log(resp)

should be 
"2022-07-12T14:00:00Z"

为此,我肯定会建议使用专门的日期/时间库。

至少可以说,普通 JavaScript 中的时区转换很棘手(尤其是从时区转换为 UTC)

然而,这在luxon中非常简单:

我在这里使用DateTime.fromSQL()函数,因为它与输入时间戳格式匹配。

 const { DateTime } = luxon; function convertToUTC(date, tzString) { const dt = DateTime.fromSQL(date, { zone: tzString }); return dt.setZone('UTC'); } console.log(convertToUTC("2022-07-12 09:00:00", "America/Chicago")); console.log(convertToUTC("2022-07-12 09:00:00", "America/Los_Angeles")); console.log(convertToUTC("2022-07-12 09:00:00", "Europe/London")); console.log(convertToUTC("2022-07-12 09:00:00", "Etc/GMT+12")); console.log(convertToUTC("2022-07-12 09:00:00", "Pacific/Kiritimati"));
 .as-console-wrapper { max-height: 100% !important; }
 <script src="https://cdnjs.cloudflare.com/ajax/libs/luxon/2.3.1/luxon.min.js" integrity="sha512-Nw0Abk+Ywwk5FzYTxtB70/xJRiCI0S2ORbXI3VBlFpKJ44LM6cW2WxIIolyKEOxOuMI90GIfXdlZRJepu7cczA==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>

我们可以在原生 JavaScript 中做到这一点,只是有点尴尬。

我们实质上是在搜索转换为目标时区时等于目标日期的 UTC 日期。

我正在使用“sv”语言(BCP47 语言标签),因为它会给我们提供 ISO 时间戳。

 function convertToUTC(date, tzString) { const dt = Date.parse(toIso(date) + 'Z'); // Go from UTC offset +15 hours to UTC offset -15 hours. This should cover existing / future zones. for(let offsetMinutes = -900; offsetMinutes <= 900; offsetMinutes += 15) { const utc = new Date(dt + offsetMinutes * 60000); if (toIso(date) === toIso(utc, tzString)) { return toIso(utc, 'UTC') + 'Z'; } } } function toIso(date, timeZone) { return new Date(date).toLocaleString('sv', { timeZone }).replace(' ', 'T'); } console.log(convertToUTC("2022-07-12 09:00:00", "America/Chicago")); console.log(convertToUTC("2022-07-12 09:00:00", "America/Los_Angeles")); console.log(convertToUTC("2022-07-12 09:00:00", "Europe/London")); console.log(convertToUTC("2022-07-12 09:00:00", "Etc/GMT+12")); console.log(convertToUTC("2022-07-12 09:00:00", "Pacific/Kiritimati"));
 .as-console-wrapper { max-height: 100% !important; }

基于MDN文档。

console.log(new Intl.DateTimeFormat('en-GB', { dateStyle: 'full', timeStyle: 'long' }).format(date));

这将输出

// Expected output "Sunday, 20 December 2020 at 14:23:16 GMT+11"

有很多选项和许多语言环境。 你可以在这里查看它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM