今天早些时候我发表了一个问题,当时我还没有把注意力集中在这个问题上。我在这里会更简洁。
我用mysql在windows上运行ror 2.1.2。SQL Server的本机时区是UTC。我当地的时区是太平洋地区(-0800)
我有一个带有:timestamp type列的模型,我可以使用它执行如下操作:

record = Record.find(:first)
record.the_time = Time.now()

当我在数据库中执行“select*from records”时,显示的时间比我的本地时间早8小时,这是正确的,因为数据库是在UTC上。(我已经通过简单的'select now()'和'select utc_timestamp()'验证了它是'thinking in utc')
这就是问题的开始。如果我在视图中显示时间:
<%= h record.the_time %>

…然后返回正确的时间,以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

……8小时的时间扭曲。为什么存储时间能正确翻译时间,而检索时间却不能?如果我比较数据库中最近一次的存储时间并将其与当前时间进行比较,那么当前时间就更少了—告诉我这不仅仅是一个字符串转换问题。
有什么想法吗?

最佳答案

config/environment.rb中有一个设置用于设置时区。可能脚本中的设置不同:

# 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_支持,则欺骗并从中获取代码片段)

关于ruby-on-rails - Ruby on Rails和Active Record独立脚本在:timestamps的数据库值上存在分歧,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/319711/

10-17 01:21