【问题标题】:how to convert javascript date according to a new timezone如何根据新时区转换javascript日期
【发布时间】:2018-10-30 23:42:47
【问题描述】:

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

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

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

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

 function convertToTimezone(date, newTimezone) {

      ... what goes here? ...

      return newDate;
 }

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

【问题讨论】:

  • I cant get it to do what I want 直截了当,不清楚你想做什么
  • 但在夏令时期间,悉尼的上午 10 点是布里斯班的上午 9 点(以及 UTC 前一天的 23:00)。这就是为什么您应该始终在幕后使用 UTC 并且只在 UI 中显示当地时间。因此,如果布里斯班有人在当地时间 13:00 预订会议,则为 03:00 UTC。现在任何人都可以打开会议并查看他们的当地时间,因此对于悉尼的某人来说是 14:00 (UTC+11)、珀斯 11:00 (UTC+8) 和穆拜 08:30 (UTC+5:30)等等……

标签: javascript date moment-timezone


【解决方案1】:

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 上的文档。

【讨论】:

  • 如何比较两个城市?说萨格勒布/孟买或悉尼/布里斯班,根据 - 设置 A 的日期时间并获得 B 的准确日期时间(也就是说在比较时已经进入 DTS)?
  • 希望我理解正确。日期/时刻将嵌入时区信息。使用 moment 可以轻松进行比较 (momentjs.com/docs/#/query),或获取两次之间的持续时间 (momentjs.com/docs/#/durations)。
  • 看我的回答。我没有专门测试过你的代码,但我的代码非常相似,它无法返回一个在不同时区具有相同挂钟时间的日期。
【解决方案2】:

好的,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()
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2019-09-14
    • 1970-01-01
    • 2019-06-15
    • 2016-11-01
    相关资源
    最近更新 更多