Ruby on Rails和Active Record独立脚本在数据库值上不同意:timestamps
我今天早些时候发布了一个问题,当时我还没有对这个问题进行过调整。 我会在这里更简洁。
我在Windows上使用MySQL运行RoR 2.1.2。 SQL Server的本机时区是UTC。 我当地的时区是太平洋(-0800)
我有一个带有:timestamp类型列的模型,我可以使用以下方法执行以下操作:
record = Record.find(:first) record.the_time = Time.now()
当我在数据库中执行“select * from records”时,显示的时间是我当地时间提前8小时,这是正确的,因为数据库是在UTC上。 (我已经通过简单的’select now()’和’select utc_timestamp()’来validation它是’在utc中思考’)
这就是麻烦开始的地方。 如果我在视图中显示时间:
…然后我回到正确的时间,以UTC格式显示。 如果我在当地时间16:40:00写入数据库,则数据库显示00:40:00。
但是,如果我运行的是独立脚本:
record = Record.find(:first) puts record.the_time
…然后我回到我存储在数据库中的UTC时间(00:40:00),但是使用本地时区:
Wed Nov 26 00:40:00 (-0800) 2008
……八小时的时间扭曲 为什么存储时间会正确地转换它,但检索它不是吗? 如果我比较数据库中最近过去的存储时间并将其与当前时间进行比较,则当前时间较少 – 告诉我这不仅仅是字符串转换问题。
有任何想法吗?
config / environment.rb中有一个设置time_zone的设置。 可能这在您的脚本中设置不同:
# Make Time.zone default to the specified zone, and make Active Record store time values # in the database in UTC, and return them converted to the specified local zone. # Run "rake -D time" for a list of tasks for finding time zone names. Uncomment to use default local time. config.time_zone = 'UTC'
您还可以尝试显式指定TZ和格式:
require 'active_support/core_ext/date/conversions' record.the_time.utc.to_s(:db)
(或者,如果您没有在独立脚本中使用active_support,请从那里作弊并抓取代码片段)
尝试要求active_support
好吧,您没有评论我最后一次重启您的服务器或控制台的建议。
我有一个类似的问题,当我这样做时它得到修复。
您还提到了一个独立脚本,但为了获得Rails的时区function,代码需要在Rails中运行。
最后,通过将时间存储为整数(Time.now()。to_i())并将它们转换回我需要显示它们的时间(Time.at(the_time_the_database_returned_to_me)),这样做要容易得多。)这不是最好的解决方案,但它是唯一有效的解决方案。