Мне нужно проанализировать строки с отметками времени и преобразовать их в Time
объекты.
Я изо всех сил пытаюсь понять, как работает Time.parse
и как игнорировать DST и всегда использовать UTC
или просто преобразовать в UTC
У меня повторяются часы при переходе от GMT
к DST
. Я пробовал:
Time.parse(t)
Time.parse(t).utc
Time.strptime(t, "%Y-%m-%d %H:%M:%S")
и все дают одинаковый результат. Это выдержка из моего кода
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-p247
на macos
(я не могу его изменить)
EDIT
Не уверен, что это хак, но добавление " 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
Конечно, последний разбор с strptime
неверен, так как игнорирует UTC
.