Дополнительно
Руби / рельсы - изменить часовой пояс времени, без изменения стоимости
У меня есть запись foo
в базе данных которого есть:значение start_timeи
:атрибуты часовой пояс`.
В :значение start_time-время в UTC -
2001-01-01 14:20:00, например. В
:временнаястрока -
Америка/Нью-Йорк`, например.
Я хочу создать новый объект времени со значением :значение start_time
но чей часовой пояс определяется :часовой пояс
. Я не хочу, чтобы загрузить :значение start_time
, а затем преобразовать в `:часовой пояс, потому что рельсы будут умными и обновление времени от UTC в соответствии с этим часовой пояс.
В настоящее время,
t = foo.start_time
=> 2000-01-01 14:20:00 UTC
t.zone
=> "UTC"
t.in_time_zone("America/New_York")
=> Sat, 01 Jan 2000 09:20:00 EST -05:00
Вместо этого, я хочу видеть
=> Sat, 01 Jan 2000 14:20:00 EST -05:00
т. е. Я хочу сделать:
t
=> 2000-01-01 14:20:00 UTC
t.zone = "America/New_York"
=> "America/New_York"
t
=> 2000-01-01 14:20:00 EST
93
9
Похоже, вы хотите что-то вдоль линий
Это говорит преобразовать в местное время (через зону) в UTC. Если у вас есть время.зоны установить то можно конечно
Это выиграл'т использовать пояс прикрепляется к т - предполагается, что это'с данным часовом поясе вы находитесь конверсии.
Один пограничный случай для того чтобы защитить против вот переход на летнее время: местное время указать не может существовать или может быть неоднозначным.
Я'вэ просто столкнулся с той же проблемой и вот что я'м собираюсь сделать:
Вот документация на asctime
Если вы're через рельсы, вот еще один способ вдоль линий Эрик Уолш'ы ответа:
Вам нужно добавить смещение времени в свое время после того, как вы преобразовать его.
Самый простой способ сделать это:
Я не уверен, почему вы хотели бы сделать это, хотя это, вероятно, лучше работать с времен, как они строятся. Я думаю, что некоторые предпосылки, почему вам необходимо перенести время и часовые пояса была бы полезна.
На самом деле, я думаю, нужно вычесть смещение после преобразования его, например:
Зависит от того, где вы собираетесь использовать это время.
Если ваше время-это атрибут
Если время используется в качестве атрибута, вы можете использовать тот же date_time_attribute камень:
Когда вы установите отдельную переменную
Использовать тот же date_time_attribute камень:
Маленькая функция Быстрая я придумал, чтобы решить задание. Если у кого-то есть более эффективный способ сделать это, пожалуйста, задайте его!
Я создал несколько вспомогательных методов, один из которых просто делает то же самое, как у автора поста на https://stackoverflow.com/q/16818180/936494.
Также я зафиксировал несколько отличительных особенностей, которые я заметил, и эти помощники содержит методы, чтобы полностью игнорировать автоматическое день-свет сбережения действующим во время перехода, который не доступен в среде Rails:
Примеры, которые можно попробовать на рельсы консоли или скрипта после обертывания вышеуказанных методов в классе или модуле:
Надеюсь, что это помогает.
Я потратил значительное время борется также с часовых поясов, а после мастерить с Ruby 1.9.3 понял, что вы Дон'т нужно преобразовать в именованный символ пояса до преобразования:
Что это означает, что вы можете сосредоточиться на получении соответствующего времени установки первых в регионе, вы хотите, как вы могли бы подумать об этом (по крайней мере в моей голове Я раздела его таким образом), а затем конвертировать в конец зоны, которую вы хотите проверить свой бизнес-логику.
Это также работает для Ruby 2.3.1.