2016-07-19 1 views
0

Я работаю с 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 способом, так что я пытаюсь похоже, такая базовая функция, поэтому мне интересно, есть ли встроенные методы, о которых я не знаю, что я мог бы использовать, чтобы сделать это проще, или если кто-нибудь знает, как лучше это сделать.

+0

В идеале вы бы работать с Первоначально были созданы объекты DateTime, что означало бы, что вы можете получить конечный результат. В прошлом мне приходилось создавать аналогичный код, и я не знаю более простого способа. – Tass

+0

@Tass Есть ли способ создать новый объект DateTime с смещением часового пояса, используя стандартное имя, например «America/New_York»? Я знаю, что номер смещения как String, например «-5», может быть использован, но поскольку это изменяется с учетом летнего времени для большинства часовых поясов в Северной Америке и Европе, я не могу думать о хорошем способе управления этим без него чувствуя даже больше, как изобретать колесо, поэтому, используя стандартное имя и позволяя Rails определять смещение, было бы идеально. –

+0

И, говоря о летних сбережениях, я просто понял, что моя коррекция «1 день» не будет работать, если она выпадет на день изменения летнего времени в часовых поясах позади UTC, так как результатом будет либо 11 вечера, либо 1 час в зависимости от направление изменения. –

ответ

0

Вы можете попробовать это:

def midnight_in_time_zone(date_string, time_zone_string) 
    date_string.in_time_zone(time_zone_string) 
end 

эта линия растет 1 день автоматически, если значение time_with_zone.utc_offset в меньше 0

Пример результата:

#Your code puts 
time_with_zone = Date.parse("2016-01-01").to_datetime.in_time_zone("America/New_York").beginning_of_day 
#=> Thu, 31 Dec 2015 00:00:00 EST -05:00 
#If you try this 
date_string.in_time_zone(time_zone_string) 
#=> Fri, 01 Jan 2016 00:00:00 EST -05:00 
+0

Thx, но следует отметить, что ваше решение работает в Rails 4. Некоторые из наших серверов все еще работают на Rails 3, но я думаю, что могу массировать его до тех пор, пока они не будут обновлены. –

 Смежные вопросы

  • Нет связанных вопросов^_^