# date_str looks something like this `12/31/2014 6:22 PM`
# tz is a string containing an ActiveSupport::TimeZone name like `US/Eastern`
def interpret_date(date_str, tz)
Time.use_zone tz do
parsed_dt = DateTime.strptime(date_str, '%m/%d/%Y %H:%M %p')
offset = parsed_dt.in_time_zone(tz).utc_offset
parsed_dt.advance(seconds: -(offset)).in_time_zone(tz)
end
end
9条答案
按热度按时间kx7yvsdv1#
可以使用
to_time_in_current_zone
将日期转换为时区。例如:gt0wga4j2#
我一直在努力解决这个问题,试图解析表单中的日期字符串,并独立于服务器时间保存它。我遵循的过程是这样的。我保证RoR和Ruby时区设置为UTC。如果服务器也是UTC时间,这会更容易。
我使用ActiveSupport:TimeZone格式(如
US/Eastern
)存储用户的区域设置。我有一个解释日期函数,它可以解释不包含时区或偏移量的日期字符串当然,这并不是一个完美的解决方案,但它确实有效。确保时区正确的步骤如下:
1.根据我们的格式解析日期字符串
1.根据该时区的时间提取当前utc偏移量(如果您解析的日期恰好是dst,而您的本地时间不是东部时间的dst,则必须执行此操作,这将确保dst是解析时间的本地时间)
1.将时间转换为我们的目标语言环境,并允许时间移动,添加正确的偏移量
6ju8rftf3#
对于Rails 5之前的版本,可以使用以下方法:
p3rjfoxz4#
试试这个
你在这里做什么:假设您要更改为时区5
我会在你的约会时间上加5个小时,保持时区不变。
之后,如何调整偏移量以恢复原始数据并获得您想要的时区。
n8ghc7c15#
我无法删除已接受的答案
正如@LeeJarvis在下面的评论部分指出的,
Chronic.parse
不接受:time_class
选项,所以这个答案是有缺陷的,虽然它看起来很有效,但实际上并没有(除非慢性病很快允许传递:time_class
选项)。慢性宝石真的很强大。
我是这样使用它的:
在我上面的例子中,
User.first.time_zone
是"太平洋时间(美国和加拿大)"。Chronic支持多种格式,请访问https://github.com/mojombo/chronic查看
确保传递
:time_class
选项并转换为UTC(在文档中,Chronic在调用parse之前设置:time_class
。我避免这种方法,因为它可能导致应用程序中的其他部分无法工作)时区的文档位于http://api.rubyonrails.org/classes/ActiveSupport/TimeZone.html
3lxsmp7m6#
我是这样使用它的:
你是这个意思吗?
pkwftd7m7#
这在Rails 5中有效:
返回指定时区中的时间。
14ifxucb8#
至少从Rails 4.2开始(可能更早,尚未测试),只要使用
Time#strptime
而不是DateTime.strptime
,就会自动应用当前时区:3qpi33ja9#
我正在"strptiming"这个字符串:
本地时间戳,在我的例子中是Auckland NZ,字符串中没有时区戳,如图所示。
据我所知,
Time.strptime
使用服务器时区作为基础。在我的情况下,一般的良好实践是,我的服务器运行在UTC时区,所以字符串的每次解析都创建一个时间对象,time to +0000(UTC):
然后转换为
in_time_zone(Time.zone)
,得到:可以看到,这比我想要的实际时间晚了12个小时(UTC偏移)。
我试着使用上面的
+' Auckland', '...%Z'
技巧,没有任何改变。然后我使用上面的+ '+1200', '...%Z'
技巧,它工作正常。然而我担心夏天的时间,然后解析将在一个小时,所以这是我的结果:
结果:
它不是特别优雅,但它的工作。