2

我今天早些时候发布了一个问题,当时我还没有完全解决这个问题。我可以在这里更简洁。

我在 Windows 上使用 MySQL 运行 RoR 2.1.2。SQL 服务器的本地时区是 UTC。我的本地时区是太平洋 (-0800)

我有一个带有 :timestamp 类型列的模型,我可以这样做:

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

当我在数据库中执行“从记录中选择 *”时,显示的时间比我的本地时间提前 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

……八小时的时间扭曲。为什么存储时间可以正确转换它,但检索它却不能?如果我比较数据库中最近存储的时间并将其与当前时间进行比较,则当前时间会更少 - 告诉我这不仅仅是字符串转换问题。

有任何想法吗?

4

4 回答 4

1

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,则作弊并从那里获取代码片段)

于 2008-11-29T23:15:42.733 回答
1

尝试要求active_support

于 2008-12-02T08:03:14.273 回答
0

好吧,您没有评论我上次重新启动服务器或控制台的建议。

我有一个类似的问题,当我这样做时它得到了解决。

您还提到了一个独立的脚本,但是为了获得 Rails 的时区功能,代码需要在 Rails 中运行。

于 2008-11-26T18:12:35.057 回答
0

最后,通过将时间存储为整数 (Time.now().to_i()) 并将它们转换回我需要显示它们的时间 (Time.at(the_time_the_database_returned_to_me) 来做到这一点要容易得多。)这几乎不是最好的解决方案,但它是唯一有效的解决方案。

于 2009-03-23T23:34:29.600 回答