momentjs:如何在特定时区获取日期

时间:2015-04-14 03:36:43

标签: javascript timezone momentjs

简而言之,我希望时刻能够尊重服务器的时区。我已经将机器的时区设置为阿拉斯加,但我已经将布里斯班的时区字符串传递给了我。现在我需要moment.toDate返回与我在当前构造函数中传递的日期实例相同的时区; e.g。

m = moment("2016-11-20T08:00:00+10:00")
m.format() // "2016-11-20T08:00:00+10:00" 
m.toDate() // Sat Nov 19 2016 13:00:00 GMT-0900 (AKST) 

我希望从输入时区的那一刻起获得Date个实例;例如以某种方式让toDate返回Sun Nov 20 2016 08:00:00 GMT+1000 (AEST)

FWIW我在使用和不使用moment.tz.setDefault时尝试了相同的代码,虽然它正确地更改了format结果,但toDate始终使用机器的时区!

更新

我需要这种行为的原因是某些JavaScript库和控件不理解moment并且仅与Date一起使用,并且时间/日期在被它们呈现时会出现偏差。我目前正在处理的一个例子是jQuery UI日期选择器控件。我希望日期选择器在服务器上(或在特定时区)显示当前日期。

提前致谢。

2 个答案:

答案 0 :(得分:2)

Date对象在内部表示UTC时间,并且可以使用投影时运行的计算机的时区。

绝对没有办法生成使用任意时区的Date对象。您可能遇到的任何尝试操纵Date对象的示例(例如通过添加或减去时区偏移)都存在根本缺陷。

Moment本身具有很好的时区支持,包括使用指定时区而不仅仅是时区偏移的时刻 - 时区扩展。但是一旦你回到Date对象 - 你就会回到该对象的行为的摆布。

抱歉,但是没有办法实现你的要求。也许您可以详细说明为什么您想要这样做,我可以推荐一种解决方法。


更新:关于您的更新,通常有一种机制可以将日期选择器中的值作为文本获取,而不是作为日期对象。使用jQuery UI日期选择器控件的示例,onSelect事件已将其作为文本提供给您,或者您只需调用.val()而不是.datepicker('getDate')即可将文本从文本中移除领域。一旦你有了文本值,你就可以随心所欲地解析它。

同样,在设置值时,您不一定需要Date个对象。您可以将文本框的值设置为字符串,也可以将字符串传递给setDate函数。

在大多数情况下,您不必浏览Date对象。但如果出于某种原因,你需要人为地构建一个像疯狂的东西:

var d = new Date(m.format('YYYY/MM/DD'));

通常情况下,我会反对 - 但如果它只是将传递值传递给UI控件,那么它可能没问题。

答案 1 :(得分:1)

这会让你在与时刻字符串相同的时区中获得片刻,但是toDate总是在本地时区。

d = "2016-11-20T08:00:00+10:00"
m = moment(d).utcOffset(d)
m.format()
m.toDate()