Ruby on rails RubyonRails和ActiveRecord独立脚本在以下数据库值上存在分歧:时间戳
今天早些时候我发布了一个问题,当时我还没有集中精力解决这个问题。我会在这里更简洁 我在Windows上用MySQL运行Ror2.1.2。SQL server的本机时区为UTC。我的本地时区是太平洋(-0800) 我有一个带有:timestamp类型列的模型,我可以使用该列执行以下操作:Ruby on rails RubyonRails和ActiveRecord独立脚本在以下数据库值上存在分歧:时间戳,ruby-on-rails,ruby,database,datetime,timezone,Ruby On Rails,Ruby,Database,Datetime,Timezone,今天早些时候我发布了一个问题,当时我还没有集中精力解决这个问题。我会在这里更简洁 我在Windows上用MySQL运行Ror2.1.2。SQL server的本机时区为UTC。我的本地时区是太平洋(-0800) 我有一个带有:timestamp类型列的模型,我可以使用该列执行以下操作: record = Record.find(:first) record.the_time = Time.now() 当我在数据库中执行“从记录中选择*时,显示的时间比我的本地时间提前八小时,这是正确的,因为数据
record = Record.find(:first)
record.the_time = Time.now()
当我在数据库中执行“从记录中选择*时,显示的时间比我的本地时间提前八小时,这是正确的,因为数据库是UTC。(我已经通过简单的“立即选择()”和“选择utc_时间戳()”验证了它是“在utc中思考”)
这就是麻烦的开始。如果我在视图中显示时间:
<%= h record.the_time %>
…然后返回存储在数据库中的UTC时间(00:40:00),但使用本地时区:
Wed Nov 26 00:40:00 (-0800) 2008
…八小时的时间偏差。为什么存储时间可以正确地转换时间,而检索时间却不能?如果我比较数据库中最近存储的时间,并将其与当前时间进行比较,那么当前时间就更少了——告诉我这不仅仅是字符串转换问题
有什么想法吗?嗯,你没有对我上次建议重新启动服务器或控制台发表评论 我有一个类似的问题,当我这样做的时候,它得到了修复
您还提到了一个独立脚本,但为了获得Rails的时区功能,代码需要在Rails中运行。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_支持,就从那里作弊并获取代码片段)尝试要求
active_支持
最后,通过将时间存储为整数(Time.now().to_i())并将它们转换回需要显示它们的时间(Time.at>)来实现这一点要容易得多(这不是最好的解决方案,但它是唯一有效的解决方案
require 'active_support/core_ext/date/conversions'
record.the_time.utc.to_s(:db)