通过api在rails中保存日期时间的最佳方法

时间:2010-01-13 10:20:22

标签: ruby-on-rails timezone

我要求通过类似POST localhost:3000/visit的api保存datetime(visited_at)属性,但问题是我不知道如何处理时区。我已经看到有关铁路时区支持的解释here,但是当你通过铁轨形式创建它时。如果有办法通过我自己的api处理这个问题,我想知道。

1 个答案:

答案 0 :(得分:2)

有3个相关问题:

  1. 解析传入时间(在您的API中)
  2. 在数据库中存储时间
  3. 向用户显示时间
  4. 您的问题主要是关于(1),但(2)和(3)也很重要。

    对于(2),我会将所有内容规范化为UTC,因此夏令时等不会对您产生影响。在config / environment.rb中,我会设置ENV['TZ'] = 'utc'只是为了安全起见。

    对于(3),如果要在本地时区显示用户的时间,则必须将其存储在用户模型中,然后适当地格式化时间。

    现在,对于(1),您应该能够解析传入的时间(例如,使用Time.parse),然后将其归一化为UTC。 Time.parse可以处理描述时区的各种方式。 (我会指定您的API来声明如果未指定时区,则假定为UTC。)

    E.g。

    >> 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