mysql - Ruby on Rails 中错误的时区转换

标签 mysql ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.2

我真的很纠结这个。 基本上我想导入一个 Excel 文件。所以我最终使用了从 Rails 导入的 CSV。

CSV.open('[path-to-file]', 'r').each do |row|

实际上导入工作正常,但除其他事项外,Excel/CSV 文件中有一个日期列,数据库中有一个日期时间列。我在 CSV.open-Method 中做了以下操作:

date = DateTime.strptime(row[0], "%Y-%m-%d").strftime("%Y-%m-%d")
start_datetime = DateTime.parse(date + " 6:30:00").utc
Event.create(:event_start => start_datetime)

这会在数据库中创建具有正确日期时间的正确事件。看起来像这样:

2008-11-18 09:30:00

我的问题:

如果我在application.rb中选择注释行

config.time_zone = 'Berlin'

Rails 使用 UTC 显示我的事件,一切看起来都像数据库的内容。

如果我选择取消注释 config.time_zone 部分(我绝对必须这样做),Rails 应该增加 1 小时(柏林:UTC/GMT +1 小时)。实际上它确实增加了至少 1 小时,但有时会增加 2 小时。没有连接(对我而言),在这种情况下,Rails 选择增加 1 或 2 小时。

如果我在正常的 Websurface(在浏览器中)上创建一个事件,一切正常(减去 1 小时以将 UTC 保存在数据库中并添加 1 小时以显示在正确的时区中)。

如果您能给我一些如何尝试定位此问题的提示,那将非常有帮助。

我的系统:Ruby 1.9.3p194 上的 Rails 3.2.3,Suse Enterprise 上的 MySQL

示例:

CSV:

2012-01-08
2012-02-09
2012-03-10
2012-04-11
2012-05-12
2012-06-13
2012-07-14
2012-08-15
2012-09-16
2012-10-17
2012-11-18
2012-12-19

数据库(MySQL):

| id | event_start
+----+---------------------    
|  1 | 2012-01-08 06:30:00
|  2 | 2012-02-09 06:30:00
|  3 | 2012-03-10 06:30:00
|  4 | 2012-04-11 06:30:00
|  5 | 2012-05-12 06:30:00
|  6 | 2012-06-13 06:30:00
|  7 | 2012-07-14 06:30:00
|  8 | 2012-08-15 06:30:00
|  9 | 2012-09-16 06:30:00
| 10 | 2012-10-17 06:30:00
| 11 | 2012-11-18 06:30:00
| 12 | 2012-12-19 06:30:00

查看(浏览器)- 这里我只使用了 .order("event_start ASC")

events.each do |ev|
ev.event_start

2012-12-19 07:30:00 +0100
2012-11-18 07:30:00 +0100
2012-10-17 08:30:00 +0200
2012-09-16 08:30:00 +0200
2012-08-15 08:30:00 +0200
2012-07-14 08:30:00 +0200
2012-06-13 08:30:00 +0200
2012-05-12 08:30:00 +0200
2012-14-11 08:30:00 +0200
2012-03-10 07:30:00 +0100
2012-02-09 07:30:00 +0100
2012-01-08 07:30:00 +0100

最佳答案

我很确定您看到的差异是因为夏令时 (DST)。

请注意,夏季的所有日期都是 +0200,而所有其他日期都是 +0100。那是您没有注意到的联系。

这是因为柏林是采用夏令时的时区。您导入的日期都是 UTC,它们以 UTC 写入数据库,但 Rails(正确地)根据它们是否在夏季以不同方式解释它们。

这就是为什么您不会得到恒定的 1 小时时差。

如果你希望时间是本地时间9:30,无论是夏天还是冬天,都可以尝试使用

Time.zone.parse("#{date} 09:30:00")

在您的导入代码中。

参见 ActiveSupport::TimeWithZone了解详情。

关于mysql - Ruby on Rails 中错误的时区转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15436253/

相关文章:

mysql - 索引sql查询

mysql - 使用 Foreign KEY 执行 SQL 时出错

mysql - 将 MySQL 数据库连接到复制和粘贴的数据目录

ruby-on-rails - Rails 4.0 expire_fragment/缓存过期不起作用

ruby-on-rails - 如何使用 HAML 生成 simple_form View ?

ruby - 在 Gemfile 中将 git-repo 传递给 gem 时,需要 gem 的问题

ruby-on-rails - 如何防止管道字符在 Rails 3/Ruby 1.9.2 中导致错误的 URI 错误?

C# 将数据导出到 Excel 时格式化列

javascript - 使用 Rails 4 单击按钮时显示确认对话框?

ruby - 将值深度嵌套到给定路径数组的哈希中