Moment-Timezone不会更改指定区域的日期/时间

时间:2017-07-16 23:05:40

标签: javascript datetime timezone momentjs

我正在使用时刻和时刻来输出给定电视节目的播出时间/时间(适用于任何时区)

主持人时区是America / Chicago

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

  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,这是不正确的。

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

enter image description here

上述的正确输出为Monday at 4:00 AM

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

2 个答案:

答案 0 :(得分:1)

如果您在7月23日21:00开始使用UTC-06:00的日期字符串,那么您将拥有如下日期:

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

要输出相当于时区的Zagreb,即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>
&#13;
&#13;
&#13;

答案 1 :(得分:1)

观察:

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');