Я работаю с Rails-приложением, которое получает дату в виде строки в формате «YYYY-MM-DD», и мне интересно, что лучший способ конвертировать его в объект TimeWithZone, установленный в полночь в определенный часовой пояс, который предоставляется базой данных также в виде строки.Лучший способ получить полночь в определенный день в определенном часовом поясе в Rails
По существу я хочу это:
"2016-06-01", "Америка/Триатлон" => Wed, 1 июня 2016 00:00:00 EDT -04: 00
" 2016-06-01 "," Европа/Берлин "=> Ср, 01 июня 2016 00:00:00 CEST +02: 00
" 2016-01-01 "," America/New_York "=> Fri, 01 января 2016 года 00:00:00 EST -05: 00
«2016-01-01», «Европа/Берлин» => Пт, 01 января 2016 00:00:00 CET +01: 00
Теперь я знаю, что это, безусловно, не просто Date.parse (х) .to_datetime.in_time_zone (у) .beginning_of_day так как для примеров «Америка/Триатлон», что дало бы «Вт, 31 Май 2016 00:00:00 EDT -04: 00 "и" Thu, 31 декабря 2015 00:00:00 EST -05: 00 "соответственно, поэтому я подумал об исправлении этого, добавив день, если utc_offset отрицательный, поэтому метод я построил в основном выглядит следующим образом:
def midnight_in_time_zone(date_string, time_zone_string)
time_with_zone = Date.parse(date_string).
to_datetime.
in_time_zone(time_zone_string).
beginning_of_day
time_with_zone += 1.day if time_with_zone.utc_offset < 0
time_with_zone
end
Это работает так, что я хочу, но он чувствует, как я изобретать колесо в Hacky способом, так что я пытаюсь похоже, такая базовая функция, поэтому мне интересно, есть ли встроенные методы, о которых я не знаю, что я мог бы использовать, чтобы сделать это проще, или если кто-нибудь знает, как лучше это сделать.
В идеале вы бы работать с Первоначально были созданы объекты DateTime, что означало бы, что вы можете получить конечный результат. В прошлом мне приходилось создавать аналогичный код, и я не знаю более простого способа. – Tass
@Tass Есть ли способ создать новый объект DateTime с смещением часового пояса, используя стандартное имя, например «America/New_York»? Я знаю, что номер смещения как String, например «-5», может быть использован, но поскольку это изменяется с учетом летнего времени для большинства часовых поясов в Северной Америке и Европе, я не могу думать о хорошем способе управления этим без него чувствуя даже больше, как изобретать колесо, поэтому, используя стандартное имя и позволяя Rails определять смещение, было бы идеально. –
И, говоря о летних сбережениях, я просто понял, что моя коррекция «1 день» не будет работать, если она выпадет на день изменения летнего времени в часовых поясах позади UTC, так как результатом будет либо 11 вечера, либо 1 час в зависимости от направление изменения. –