如何根据新时区转换javascript日期

时间:2018-10-30 23:42:48

标签: javascript date moment-timezone

我以为我对此有把握,但是我无法解决。

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

2)用户然后通过标识符'Australia / Brisbane'选择一个不同的时区(这是一个不同的TZ,并且可能具有夏时制等),假设其+1小时

我想做的是有一个函数,该函数接受一个表示[10am'Australia / Sydney']的Date对象,并向我返回一个表示[10am'Australia / Brisbane]的新Date,即基础UTC时间将移了+1小时

theta

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

2 个答案:

答案 0 :(得分:0)

moment-timezone库应该使这个琐碎的事情变得简单:

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

或者如果date已经是moment

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

有关更多信息,请参见Converting to Zone上的文档。

答案 1 :(得分:0)

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

总而言之,我想获取一个具有挂钟时间的javascript日期,例如与某个时区标识符相关联的“ 2018年9月15日上午10点”,例如Br​​isabneOz。

,然后将其转换为代表相同壁钟时间但在不同时区的新日期。换句话说,根据时区和/或夏令时等的变化来更改基础UTC时间。

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

让我感到困惑的部分是必须走到弦上-认为我可以传递一个日期并获得moment.tz来魔术另一个日期,例如@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()
}