У меня есть запись foo
в базе данных , которая имеет :start_time
и :timezone
атрибуты.
Это :start_time
время в формате UTC 2001-01-01 14:20:00
, например. Это :timezone
строка - America/New_York
например.
Я хочу создать новый объект Time со значением :start_time
но чей часовой пояс указан с помощью :timezone
. Я не хочу загружать, :start_time
а затем конвертировать в :timezone
, потому что Rails будет умным и обновит время от 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
Ответы:
Похоже, вы хотите что-то вроде
Это говорит о преобразовании этого местного времени (с использованием зоны) в utc. Если вы
Time.zone
установили, вы, конечно, можетеПри этом не будет использоваться часовой пояс, связанный с t - предполагается, что он является локальным по отношению к часовому поясу, из которого выполняется преобразование.
Один крайний случай, от которого здесь следует остерегаться, - это переходы на летнее время: указанное вами местное время может не существовать или быть неоднозначным.
источник
Time.use_zone(self.timezone) { Time.zone.local_to_utc(t) }.localtime
Я только что столкнулся с той же проблемой, и вот что я собираюсь сделать:
Вот документация по asctime
источник
asctime
является то, что он сбрасывает любые субсекундные значения (которые сохраняются в моем ответе).Если вы используете Rails, вот еще один метод, аналогичный ответу Эрика Уолша:
источник
.in_time_zone
до конца.Time.zone.now
сработает замена на то, что ближе всего к тому времени, когда вы хотите изменить?Вам нужно добавить смещение времени к вашему времени после его преобразования.
Самый простой способ сделать это:
Я не уверен, зачем вам это нужно, хотя, вероятно, лучше всего работать со временем так, как оно построено. Думаю, вам будет полезна некоторая справочная информация о том, почему вам нужно сдвигать время и часовые пояса.
источник
Time.in_time_zone
, потребовав правильные части active_support:require 'active_support/core_ext/time'
На самом деле, я думаю, вам нужно вычесть смещение после его преобразования, как в:
источник
Зависит от того, где вы собираетесь использовать это время.
Когда ваше время - атрибут
Если время используется как атрибут, вы можете использовать тот же гем date_time_attribute :
Когда вы устанавливаете отдельную переменную
Используйте тот же гем date_time_attribute :
источник
Я придумал небольшую быструю функцию, чтобы решить эту задачу. Если у кого-то есть более эффективный способ сделать это, опубликуйте его!
источник
Предпосылка OP неверна: «Я не хочу загружать: start_time, а затем конвертировать в: timezone, потому что Rails будет умен и обновит время из UTC, чтобы оно соответствовало этому часовому поясу». Это не обязательно верно, как показывает ответ, представленный здесь.
источник
t.zone
раньшеt.change
? А что насчет того, когда ты бежишьt.zone
за нимt.change
? А какие именно параметры вы переходитеt.change
?Я создал несколько вспомогательных методов, один из которых выполняет то же самое, что и первоначальный автор сообщения на Ruby / Rails - изменение часового пояса Time без изменения значения .
Также я задокументировал некоторые особенности, которые я наблюдал, а также эти помощники содержат методы, позволяющие полностью игнорировать автоматическую экономию дневного света, применимую при преобразованиях времени, которые недоступны из коробки в среде Rails:
Примеры, которые можно попробовать на консоли rails или в сценарии ruby после обертывания вышеуказанных методов в классе или модуле:
Надеюсь это поможет.
источник
Вот еще одна версия, которая сработала для меня лучше, чем текущие ответы:
Он переносит наносекунды с использованием «% N». Если вам нужна другая точность, см. Эту ссылку на strftime .
источник
Я также потратил много времени на борьбу с часовыми поясами, и после работы с Ruby 1.9.3 понял, что вам не нужно преобразовывать в именованный символ часового пояса перед преобразованием:
Это означает, что вы можете сосредоточиться на получении подходящей настройки времени сначала в нужном регионе, как вы думаете об этом (по крайней мере, в моей голове я разбиваю его таким образом), а затем преобразовать в конце в зону вы хотите проверить свою бизнес-логику с помощью.
Это также работает для Ruby 2.3.1.
источник