Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails RubyonRails和ActiveRecord独立脚本在以下数据库值上存在分歧:时间戳_Ruby On Rails_Ruby_Database_Datetime_Timezone - Fatal编程技术网

Ruby on rails RubyonRails和ActiveRecord独立脚本在以下数据库值上存在分歧:时间戳

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() 当我在数据库中执行“从记录中选择*时,显示的时间比我的本地时间提前八小时,这是正确的,因为数据

今天早些时候我发布了一个问题,当时我还没有集中精力解决这个问题。我会在这里更简洁

我在Windows上用MySQL运行Ror2.1.2。SQL server的本机时区为UTC。我的本地时区是太平洋(-0800)

我有一个带有:timestamp类型列的模型,我可以使用该列执行以下操作:

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)