【问题标题】:Best way to save datetime via api in rails通过rails中的api保存日期时间的最佳方法
【发布时间】:2010-01-13 10:20:21
【问题描述】:

我需要通过POST localhost:3000/visit 之类的api 保存日期时间(visited_at)属性,但问题是我不知道如何处理时区。我已经看到有关铁路时区支持here 的解释,但是当您通过rails 表单创建它时。我想知道是否有办法通过我自己的api来处理这个问题。

【问题讨论】:

    标签: ruby-on-rails timezone


    【解决方案1】:

    有3个相关问题:

    1. 解析传入时间(在您的 API 中)
    2. 在您的数据库中存储时间
    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
    

    【讨论】:

    • 谢谢,你的回答正是我要问的,这在本地主机上就像一个魅力,但在生产中它不起作用我不知道为什么 = =。我使用 javascript new Date() 将日期时间发送到站点。这是其格式“2010 年 1 月 15 日星期五 00:41:25 GMT+0700(东南亚标准时间)”。我尝试将其转换为 UTC 以按照您的建议使用 Time.zone.parse() 将其保存在我的数据库中,并且它在我的本地主机上运行良好,但它不在生产环境中。
    • 此时,您可以调试差异。它是否适用于在您的开发机器上运行的生产环境(RAILS_ENV=production(在本地设置数据库等)?您的生产机器和开发机器之间有什么区别?
    猜你喜欢
    • 2018-05-25
    • 2011-04-16
    • 1970-01-01
    • 2011-10-13
    • 1970-01-01
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多