![](/img/trans.png)
[英]Get local time representation of Date in arbitrary timezone in arbitrary day - considering Daylight Savings Time
[英]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; }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.