简而言之,我希望时刻能够尊重服务器的时区。我已经将机器的时区设置为阿拉斯加,但我已经将布里斯班的时区字符串传递给了我。现在我需要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日期选择器控件。我希望日期选择器在服务器上(或在特定时区)显示当前日期。
提前致谢。
答案 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()