在轨道3.2上的某个区域中转换日期

时间:2012-08-14 11:48:19

标签: ruby-on-rails-3 date datetime time timezone

我有3个对象 - @ date,@ time和@datetime。如何使用对象@time和@datetime中的区域将对象@date转换为时间(和日期时间)?

示例:

@date = '2012-1-1'
@time = '2012-08-14 14:48:47 +1000'
@datetime = '2012-08-14 14:48:47 +0500'
@converted_date_to_time = ...     # should give '2012-1-1 00:00:00 +1000'
@converted_date_to_datetime = ... # should give '2012-1-1 00:00:00 +0500'

2 个答案:

答案 0 :(得分:2)

您可以解析这样的日期

1.9.3p194> date = '2012-1-1'
=> "2012-1-1" 
1.9.3p194> Time.parse(date)
=> 2012-01-01 00:00:00 +1300 

那是使用我当地的时区(惠灵顿,+ 13)。您也可以用同样的方式解析时间字符串

1.9.3p194> time = '2012-08-14 14:48:47 +1000'
=> "2012-08-14 14:48:47 +1000" 
1.9.3p194> Time.parse(time)
=> 2012-08-14 16:48:47 +1200 

您会注意到它看起来有点不对,但那是因为它再次使用我的本地时区,所以它准确但目前在我的时区。然后,您可以将其转换为您想要的时区。

1.9.3p194> Time.parse(time).in_time_zone('Moscow')
=> Tue, 14 Aug 2012 08:48:47 MSK +04:00

1.9.3p194> Time.parse(time).in_time_zone('Brisbane')
=> Tue, 14 Aug 2012 14:48:47 EST +10:00 

这也适用于您的datetime字符串。

如果您想使用特定时区,可以按照以下步骤进行操作

1.9.3p194> Time.find_zone('Tokyo').parse('2012-08-14 14:48:47 +0500')
=> Tue, 14 Aug 2012 18:48:47 JST +09:00 

答案 1 :(得分:2)

如果您希望在config.time_zone中指定的区域中解析时间,可以使用:

Time.zone.parse('2012-08-14 14:48:47 +1000')

我不会使用DateTime,除非你有一些特殊要求,因为Time类现在支持大范围的日期,Rails通过Time.zone处理时区真的很好。