【问题标题】:Same date in different time zone不同时区的同一日期
【发布时间】:2015-04-20 00:37:38
【问题描述】:

我的问题是如何在不同的时区获得相同的日、月、年、时、分、秒,例如:

var now = moment().valueOf();
var result1 = moment(now).format('DD-MM-YYYY HH:mm:SS Z');

在我的时区,我得到这样的结果:

18-02-2015 21:08:34 +01:00

那么我怎样才能只更改时区而不更改其他值(天、月、...、分钟、...)

我想得到这样的东西:

    result2: 18-02-2015 21:08:34 +01:00
    result3: 18-02-2015 21:08:34 +10:00
    result4: 18-02-2015 21:08:34 +05:00
    result5: 18-02-2015 21:08:34 -06:00
    result6: 18-02-2015 21:08:34 -11:00

提前致谢

【问题讨论】:

  • 不确定你的意思。如果您在不调整时间的情况下更改了时区偏移 - 那么它将不再代表相同的“现在”时刻。
  • 顺便说一句-“现在”在您的代码中是多余的。您可以删除第一行并执行 moment().format...
  • 谢谢你,马特,我的问题是在 defirent 时区获得相同的日期,而不改变任何内容(天、月、小时、分钟,...)只改变时区,这是我需要的,但我无法得到它。
  • 这是一个完全合法的用例 imo。我有一个网站只为特定时区设置应用程序,因此当用户从不同位置制作应用程序时,它会得到不同的结果。

标签: date timezone momentjs


【解决方案1】:

以下是您可以按照您的要求进行操作的方法:

// get a moment representing the current time
var now = moment();

// create a new moment based on the original one
var another = now.clone();

// change the offset of the new moment - passing true to keep the local time
another.utcOffset('+05:30', true);

// log the output
console.log(now.format());      // "2016-01-15T11:58:07-08:00"
console.log(another.format());  // "2016-01-15T11:58:07+05:30"

但是,您必须认识到两件重要的事情:

  • another 对象不再代表当前时间 - 即使在目标时区。这是一个完全不同的时刻。 (世界不会同步本地时钟。如果同步了,我们就不需要时区了!)。

    因此,即使上面的代码满足了所提出的问题,我强烈建议不要使用它。相反,请重新评估您的要求,因为他们可能误解了时间和时区的性质。

  • 时区不能仅由偏移量完全表示。阅读the timezone tag wiki 中的“时区!= 偏移量”。虽然有些时区有固定的偏移量(例如印度使用的 +05:30),但许多时区会在一年中的不同时间点改变它们的偏移量以适应daylight saving time

  • 如果你想解决这个问题,你可以使用moment-timezone 而不是调用utcOffset(...)。但是,我的第一个项目符号中的问题仍然适用。

// get a moment representing the current time
var now = moment();

// create a new moment based on the original one
var another = now.clone();

// change the time zone of the new moment - passing true to keep the local time
another.tz('America/New_York', true); // or whatever time zone you desire

// log the output
console.log(now.format());      // "2016-01-15T11:58:07-08:00"
console.log(another.format());  // "2016-01-15T11:58:07-05:00"

【讨论】:

  • 嗨,Matt 感谢上面列出的解决方案,它确实有效,但我不确定如何使用 moment.tz 代替 offset 你能详细说明它将如何替换上面的示例吗?
  • 我已经解释过了。您只需将第三行代码替换为我最后显示的代码即可。
  • @Zouhair 可能希望它来处理无能的库。以ngx-bootstraps DatePicker 为例。它总是处理当地时区,但如果你希望它在 UTC 时区,那么这样的事情可能会起作用。
  • @drenda - 它还在那里。无论如何对我有用。也许你有一个旧版本。或者,也许您只有 moment 并且没有安装 moment-timezone 插件。
  • NuGet 包已过期。如果您通过 NuGet 获取时刻时区,则它目前在 v0.5.13 上。 keepTime 标志直到 v0.5.14 才引入。
【解决方案2】:

投票最多的答案是混乱的 IMO。这是一个更清洁的解决方案 - 类似于 BlueSam 的答案,但更安全:

const myTime = moment.tz('2016-08-30T22:00:00', moment.ISO_8601, 'America/Denver')

myTime.format() //2016-08-30T22:00:00-06:00

const sameTimeDifferentZone = moment.tz(myTime.format('YYYY-MM-DDTHH:mm:ss.SSS'), moment.ISO_8601, 'America/New_York')

sameTimeDifferentZone.format() //2016-08-30T22:00:00-04:00

【讨论】:

  • 这和我做的一模一样。
【解决方案3】:

在阅读了上述 cmets 之后,我想我会根据 Joao 的回答添加。 在我的情况下,我试图使用带有时区的预先存在的时刻日期并将其转换为另一个时区,同时保留原始日期值(如问题中所述)。

var newTimezone = 'America/Denver';

//date - contains existing moment with timezone i.e 'America/New_York'
moment.tz(date.format('YYYY-MM-DDTHH:mm:ss'), 'YYYY-MM-DDTHH:mm:ss', newTimezone);

【讨论】:

  • 没问题,很高兴它有帮助!
【解决方案4】:

从那一刻起文档:http://momentjs.com/timezone/docs/

参考 moment-timezone-with-data.js 并指定要转到哪个时区,如下所示:

moment(date).tz("America/Los_Angeles").format()

【讨论】:

  • 已更新。您可以在没有时区的情况下格式化日期
  • 您的代码已关闭。您只需致电moment().tz("America/Los_Angeles").format("...whatever format...")。当字符串被格式化和重新解析时,您编写它的方式可能会混淆月份和日期。 (但仍然没有按照提出的方式解决问题。)
  • 我只是想举个例子。我已经更新了我的答案,以更准确地反映我想说的话
猜你喜欢
  • 2020-08-10
  • 1970-01-01
  • 2012-05-19
  • 1970-01-01
  • 2015-02-15
  • 2023-04-07
  • 2020-03-17
  • 1970-01-01
  • 2010-11-18
相关资源
最近更新 更多