Как игнорировать DST при разборе строки на время (Time.parse) в Ruby - PullRequest
2 голосов
/ 22 мая 2019

Мне нужно проанализировать строки с отметками времени и преобразовать их в 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.

...