如何将时间从UTC转换为“太平洋/复活节”?

时间:2018-07-09 12:50:25

标签: javascript momentjs

我从服务器获取的时间为“ 19:30”,但需要将其转换为“太平洋/复活节时区”。

我尝试过类似的事情

 let t = "19:30:00";
let utc = moment.utc(t);
let z = moment(utc).utcOffset(-300).format('HH:mm');

但是我在某个地方出错了。

在我的开发应用程序版本中,我看到它正在转换为14:30,就像-5:00小时一样。

那么,如何获得类似的结果?

这是我尝试过的其他东西

let t = "19:30:00"; 
let tt = moment.tz(t, "UTC");
let nt = tt.clone().tz("Pacific/Easter"); 

,我也将nt设为“ 19:30:00”。所以,它根本没有转换

这似乎正在起作用。 却没有显示正确的结果

let t = "19:30:00";
let utc = moment.utc(t, 'HH:mm:ss');
let z = utc.tz('Pacific/Easter').format('HH:mm');
console.log(z);

应将结果显示为19:30 -5小时,应为14:30, 但结果显示为13:30。所以,任何人都知道为什么会这样吗?

2 个答案:

答案 0 :(得分:1)

您需要即时时区才能正常工作。

var newYork    = moment.tz("2014-06-01 12:00", "America/New_York");
var losAngeles = newYork.clone().tz("America/Los_Angeles");

答案 1 :(得分:1)

您必须从moment-timezone开始使用tz()功能。

由于您的输入(19:30:00并非采用ISO 8601 / RFC 2822认可的格式,因此您必须使用parse并将'HH:mm:ss'作为第二个参数来moment.utc(String, String)

然后,您可以使用tz()将矩对象转换为给定的时区。

请注意,即使您仅提供时间,也要创建包含日期的矩对象。如文档的Default部分所述:

  

您可以创建一个矩对象,仅指定某些单位,其余的将默认为当前的日期,月份或年份,或小时,分钟,秒和毫秒的默认值为0。

'Pacific/Easter'使用Daylight Saving Time(请参阅完整信息here),因此转换取决于日期和夏令时。

如果要使用固定偏移量(无DST),则可以使用utcOffset()

  

通过提供分钟数来设置UTC偏移量。请注意,一旦设置了偏移量,它便会固定不变,并且不会单独更改(即没有DST规则)。

     

如果输入小于16且大于-16,它将把您的输入解释为小时数。

这里有一个现场样本:

let t = "19:30:00";
let utc = moment.utc(t, 'HH:mm:ss');
let z = utc.tz('Pacific/Easter').format('HH:mm');
console.log(z);

// DST
console.log( moment.utc('2018-09-01 19:30:00').tz('Pacific/Easter').format('HH:mm') );
// No DST
console.log( moment.utc('2018-06-01 19:30:00').tz('Pacific/Easter').format('HH:mm') );
// Fixed offset
console.log( moment.utc('19:30:00', 'HH:mm:ss').utcOffset(-5).format('HH:mm') );
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.17/moment-timezone-with-data-2012-2022.min.js"></script>