【发布时间】:2010-01-13 10:20:21
【问题描述】:
我需要通过POST localhost:3000/visit 之类的api 保存日期时间(visited_at)属性,但问题是我不知道如何处理时区。我已经看到有关铁路时区支持here 的解释,但是当您通过rails 表单创建它时。我想知道是否有办法通过我自己的api来处理这个问题。
【问题讨论】:
我需要通过POST localhost:3000/visit 之类的api 保存日期时间(visited_at)属性,但问题是我不知道如何处理时区。我已经看到有关铁路时区支持here 的解释,但是当您通过rails 表单创建它时。我想知道是否有办法通过我自己的api来处理这个问题。
【问题讨论】:
有3个相关问题:
您的问题主要是关于 (1),但 (2) 和 (3) 也很重要。
对于 (2),我会将所有内容标准化为 UTC,因此夏令时等不会影响您。在 config/environment.rb 中,我会设置 ENV['TZ'] = 'utc' 只是为了安全起见。
对于 (3),如果您想以当地时区向用户显示时间,则必须将其存储在您的用户模型中,然后适当地格式化时间。
现在,对于 (1),您应该能够解析传入时间(例如使用 Time.parse),然后将其标准化为 UTC。 Time.parse 可以处理描述时区的各种方式。 (我会指定您的 API 以说明如果未指定时区,则假定为 UTC)。
例如
>> ENV['TZ']
=> "utc"
>> Time.now.to_s
=> "Wed Jan 13 16:43:00 +0000 2010"
>> Time.parse( "Wed Jan 13 16:43:00 +0500 2010" )
=> Wed Jan 13 11:43:00 +0000 2010
>> Time.parse( "Wed Jan 13 16:43:00 -0500 2010" )
=> Wed Jan 13 21:43:00 +0000 2010
>> Time.parse( "Wed Jan 13 16:43:00 EST 2010" )
=> Wed Jan 13 21:43:00 +0000 2010
>> Time.parse( "Wed Jan 13 16:43:00 CST 2010" )
=> Wed Jan 13 22:43:00 +0000 2010
>> t1 = "Wed Jan 13 16:43:00 CST 2010"
=> "Wed Jan 13 16:43:00 CST 2010"
>> t2 = "Wed Jan 13 17:43:00 EST 2010"
=> "Wed Jan 13 17:43:00 EST 2010"
>> Time.parse(t1) == Time.parse(t2)
=> true
【讨论】: