【问题标题】:Moment-Timezone is not changing the date/time for the specified regionMoment-Timezone 不会更改指定区域的日期/时间
【发布时间】:2017-12-21 09:24:06
【问题描述】:

我正在使用 moment 和 moment-timezone 来输出给定电视节目的播出日期/时间(对于任何时区)

主机时区是美国/芝加哥

在下面的示例中,传入的dateTime 是一个播出时间为 3 小时的电视节目。美国/芝加哥是周日晚上 9:00,欧洲/萨格勒布是周一凌晨 4:00:

  determineAirTime(dateTime) {
    console.log(dateTime); // July 16th 2017 9:00PM

    dateTime = 
 momentTimezone.tz(dateTime, "MMM Do YYYY hA", momentTimezone.tz.guess());

    dateTime = dateTime.format(); // this creates: 2017-07-16T21:00:00-05:00

   // moment
   moment(dateTime).calendar(); // Today at 9:00 PM
  }

对于我的时区(美国/芝加哥),Today at 9:00 PM 是正确的。但是,它总是为任何时区输出Sunday 9:00 pm,这是不正确的。

这是我们在示例中使用的相同数据的示例,但时区不同:

上面的正确输出是Monday at 4:00 AM

如何修复我的程序,以便打印出正确的时区播出/日期时间?

【问题讨论】:

  • 发布文本比发布图像要好得多。鉴于萨格勒布是 UTC+01:00,那么 2017-07-23T21:00:00+02:00 是 2017-07-23T20:00:00+01:00。为什么你认为时间应该是 04:00?美国/芝加哥是 UTC-06:00,所以应该是 2017-07-23T13:00:00-06:00 或下午 1 点。
  • 现在是萨格勒布的凌晨 1:23,我的示例的通话时间是从现在开始的 3 小时,因此输出应该是星期一凌晨 4:00。或者类似的东西
  • 也许您应该指定一些精确的输入、输出和偏移量。你的问题不清楚。
  • 我会尝试改写问题
  • 在您的问题中,dateTime 的值是多少? thing 的价值是什么?主机时区是什么?

标签: javascript datetime timezone momentjs


【解决方案1】:

如果您从 7 月 23 日 21:00 的 UTC-06:00 日期字符串开始,那么您的日期如下:

var s = '2017-07-23T21:00:00-0600';

要在相当于萨格勒布(UTC+01:00)的时区输出,请使用:

var s = '2017-07-23T21:00:00-0600';
var d = moment(s);

console.log('America/Chicago: ' + 
             d.tz('America/Chicago').format('dddd D MMMM, YYYY hh:mm a'));

console.log('Europe/Zagreb: ' + 
             d.tz('Europe/Zagreb').format('dddd D MMMM, YYYY hh:mm a'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.13/moment-timezone-with-data.min.js"></script>

【讨论】:

  • 谢谢!我会试一试
【解决方案2】:

观察:

var dateTime = 'July 16th 2017 9:00PM';  // as you said in your question

// create a moment object in the original time zone
var m = moment.tz(dateTime, 'MMM Do YYYY h:mmA', 'America/Chicago');

// switch to the target time zone and format back to a string
var s = m.tz('Europe/Zagreb').format('MMM Do YYYY h:mmA');  // 'Jul 17th 2017 4:00AM'

另外,在您的代码中,您使用了moment.tz.guess()。那是不必要的。如果您打算使用本地时区,则只需调用 local 函数。换句话说,把我上面写的最后一行改成:

var s = m.local().format('MMM Do YYYY h:mmA');

【讨论】:

    猜你喜欢
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 2013-09-21
    • 2016-12-06
    • 2017-04-18
    • 1970-01-01
    • 2018-02-10
    • 1970-01-01
    相关资源
    最近更新 更多