首页 > 解决方案 > 在Ruby中将字符串解析为时间(Time.parse)时如何忽略DST

问题描述

我需要用时间戳解析字符串并将它们转换为Time对象。

我正在努力了解如何Time.parse工作以及如何忽略 DST 并始终使用UTC或简单地转换为UTC

当时间从 转换GMT到时,我一直有重复的小时数DST。我努力了:

并且都给出相同的结果。这是我的代码的摘录

require 'time'
ts = ["2010-03-28 00:00:00", "2010-03-28 01:00:00", "2010-03-28 02:00:00", "2010-03-28 03:00:00"]

ts.each do |t|
  puts "t: #{t} -- pt: #{Time.parse(t)} -- dst: #{Time.parse(t).dst?} -- utc: #{Time.parse(t).utc} -- strptime: #{Time.strptime(t, "%Y-%m-%d %H:%M:%S")}"
end

输出是:

t: 2010-03-28 00:00:00 -- pt: 2010-03-28 00:00:00 +0000 -- dst: false -- utc: 2010-03-28 00:00:00 UTC -- strptime: 2010-03-28 00:00:00 +0000
t: 2010-03-28 01:00:00 -- pt: 2010-03-28 02:00:00 +0100 -- dst: true -- utc: 2010-03-28 01:00:00 UTC -- strptime: 2010-03-28 02:00:00 +0100
t: 2010-03-28 02:00:00 -- pt: 2010-03-28 02:00:00 +0100 -- dst: true -- utc: 2010-03-28 01:00:00 UTC -- strptime: 2010-03-28 02:00:00 +0100
t: 2010-03-28 03:00:00 -- pt: 2010-03-28 03:00:00 +0100 -- dst: true -- utc: 2010-03-28 02:00:00 UTC -- strptime: 2010-03-28 03:00:00 +0100

地点:英国(如果locale很重要)

时间:DST

Ruby 2.0.0-p247macos(我不能改变它)

编辑

不确定这是一个 hack,但添加" UTC"到时间字符串可以解决问题。查看更新的代码:

require 'time'
ts.map{|t| t + " UTC"}.each do |t|
  puts "t: #{t} -- pt: #{Time.parse(t)} -- dst: #{Time.parse(t).dst?} -- utc: #{Time.parse(t).utc} -- \
  strptime: #{Time.strptime(t, "%Y-%m-%d %H:%M:%S")}"
end

现在的输出是:

t: 2010-03-28 00:00:00 UTC -- pt: 2010-03-28 00:00:00 UTC -- dst: false -- utc: 2010-03-28 00:00:00 UTC --   strptime: 2010-03-28 00:00:00 +0000
t: 2010-03-28 01:00:00 UTC -- pt: 2010-03-28 01:00:00 UTC -- dst: false -- utc: 2010-03-28 01:00:00 UTC --   strptime: 2010-03-28 02:00:00 +0100
t: 2010-03-28 02:00:00 UTC -- pt: 2010-03-28 02:00:00 UTC -- dst: false -- utc: 2010-03-28 02:00:00 UTC --   strptime: 2010-03-28 02:00:00 +0100
t: 2010-03-28 03:00:00 UTC -- pt: 2010-03-28 03:00:00 UTC -- dst: false -- utc: 2010-03-28 03:00:00 UTC --   strptime: 2010-03-28 03:00:00 +0100

当然,最后一次解析 withstrptime是错误的,因为它忽略了UTC.

标签: rubytimeutcdstdatetime-parsing

解决方案


推荐阅读