2016-11-21 100 views
1

我很尴尬(和震惊)我找不到这样的SO或谷歌上的好答案,请随时指出我有一个dup,但...从时区和日期和时间创建时间对象?

我想要一个功能(在纯Ruby理想,但active_support解决方案都OK),其工作原理是这样:

输入:一些合理的格式(例如,2016-12-25 12:00)和时区的日期时间字符串。 偏移,而是一个时区,如America/ChicagoAmerica/New_York)。例如,

make_time_in_zone('2016-12-25 12:00', 'America/Chicago') 

输出:表示该时间精确点A TimeDateTime对象。也就是说,函数应该使用时区来考虑偏移和夏时制时间调整,以便您可以知道,例如,在America/Chicago的圣诞节中午中午UTC时间是什么时候。

我知道我可以将时区设置为所需的时区,创建Time对象,然后将时区设置回系统一,但我认为这是一个不可接受的解决方案,并且需要一个实际支持此功能的函数用例。

+0

看看这对你的作品以某种方式:http://stackoverflow.com/questions/34175813/convert-string-to-date-of-specific-timezone/34176272#34176272 – Beartech

+0

不太。 'in_time_zone'完成另一个方向:准确地确定一个时间点,并告诉你它在某个时区的日期和时间。舍入到午夜,并添加招将不必总是工作,无论是(至少对于一般的情况下),因为这取决于区和时间,'in_time_zone'可以向前移动你*或*向后 – Jonah

+0

天还没什么明确你要。 “......这样你就可以知道,例如,在美国/芝加哥的圣诞节中午几点了。”你的意思是UTC吗?因为在美国/芝加哥的圣诞节中午是中午。没有意义成为一个自作聪明,真的不理解你想要什么。 – Beartech

回答

1

只需使用in_time_zone即可解析时区中的日期。您可以将时区作为参数传递。

in_time_zone(zone = ::Time.zone) 

这将返回到你想要的。

'2016-12-25 12:00'.in_time_zone('America/Chicago') 
#=> Sun, 25 Dec 2016 12:00:00 CST -06:00 

'2016-12-25 12:00'.in_time_zone('America/New_York') 
#=> Sun, 25 Dec 2016 12:00:00 EST -05:00 
+0

这正是我正在寻找的,谢谢。 – Jonah

2

Rails的商店当前区域在当前线程,因此最正确的方法是设定解析区域。像

Time.use_zone('America/Chicago') { Time.zone.parse('2016-12-25 12:00')} 

的东西还有更多的“的hackish”的方式,但它不是公共API。

ActiveSupport::TimeZone['America/Chicago'].parse('2016-12-25 12:00')