-1

我以为我能解决这个问题,但我无法解决。

场景:
1)用户选择一个日期小部件,该小部件在本地时区传回一个日期,比如说上午 10 点“澳大利亚/悉尼”

2)然后用户选择一个不同的时区,通过标识符'澳大利亚/布里斯班'(这是一个不同的TZ,可能有夏令时等......)让我们假设它的+1小时

我想要做的是有一个函数,它接受一个代表 [10am 'Australia/Sydney'] 的 Date 对象并向我返回一个代表 [10am 'Australia/Brisbane] 的新日期,即基础 UTC 时间将移动 +1hr

 function convertToTimezone(date, newTimezone) {

      ... what goes here? ...

      return newDate;
 }

我一直在纠结时刻时区,我无法让它做我想做的事。

4

2 回答 2

0

好的,FWIW,我自己得到了答案。moment.tz 不像我想象的那样工作。

总而言之,我想采用一个带有挂钟时间的 javascript 日期,比如“2018 年 9 月 15 日上午 10 点”,它与某个时区标识符相关联,比如 BrisabneOz。

并将其转换为代表相同挂钟时间但位于不同时区的新日期。换句话说,将基础 UTC 时间更改为时区和/或夏令时等所需的时间......

我发现这样做的方法是获取挂钟日期的字符串,从而从 tbe 等式中剥离任何关联的时区,并使用 moment.tz 使用新的不同时区创建另一个日期对象。它可以做什么。

让我感到困惑的部分是必须将字符串作为一个步骤 - 以为我可以通过一个日期并让 moment.tz 魔术我另一个日期ala @Alex Taylor 回答,但这实际上不起作用。

function convertDateToTimezone(date, timezone) {
    const str = moment(date).format('YYYY-MM-DD HH:mm:ss');
    const tzMoment = moment.tz(str, timezone.identifier)
    return tzMoment.toDate()
}
于 2018-11-01T00:53:22.800 回答
0

moment-timezone图书馆应该使这变得微不足道:

function convertToTimezone(date, newTimezone) {
    return moment(date).tz(newTimezone);
}

或者如果date已经是moment

function convertToTimezone(date, newTimezone) {
    return date.clone().tz(newTimezone);
}

有关详细信息,请参阅有关转换为区域的文档。

于 2018-10-31T00:29:37.347 回答