首页 > 解决方案 > 时刻时区将UTC更改为默认时区

问题描述

语境:

我需要将来自 UTC 的日期时间解析为当前由 moment-timezone 设置为默认值的时区moment.tz.setDefault

尝试(功能):

const task = {
    startDate: '2020-03-24 14:00:00'
};

const startDateMoment = moment.utc(task.startDate).tz(moment().tz());

但是,每次需要设置时区时,我都会创建一个新的时刻对象。有没有更高效的方式在 utc 到默认时区之间进行转换,或者从时刻获取默认时区?

moment.tz.guess()从浏览器猜测时区,而不是手动设置的时区。

console.log(`default timezone: "${moment().tz()}", guessed timezone: "${moment.tz.guess()}"`);

返回

default timezone: "US/Samoa", guessed timezone: "America/Vancouver"

标签: javascriptmomentjsmoment-timezone

解决方案


经过一番挖掘,我确实找到了以下未记录的、自行承担风险使用、随时可能消失的属性:

moment.defaultZone.name

moment.defaultZone是一个Zone Object,我们真的只关心它的name属性。

请注意,如果您尚未设置默认值,则它为 null!在下面的代码中,我利用了几个新的 JavaScript 特性、可选链nullish 合并运算符来查看是否设置了默认区域,如果没有,则使用该moment.tz.guess()值。

const task = {
    startDate: '2020-03-24 14:00:00'
};

console.log('before setting default: ', moment.defaultZone);

moment.tz.setDefault('US/Samoa');

console.log('after setting default: ', moment.defaultZone);

const startDateMoment = moment.utc(task.startDate).tz(moment.defaultZone?.name ?? moment.tz.guess());

console.log(startDateMoment.format());
<script src="https://momentjs.com/downloads/moment.min.js"></script>
<script src="https://momentjs.com/downloads/moment-timezone-with-data.min.js"></script>


推荐阅读