Подтвердить что ты не робот

Как изменить часовой пояс DateTime в Ruby?

Чтение, запись и сериализация дат и времени при сохранении постоянной часового пояса становится раздражающей. Я использую Ruby (и Rails 3.0) и пытаюсь изменить часовой пояс DateTime. (по UTC), но не по времени.

Я хочу это:

t = DateTime.now
t.hour
-> 4
t.offset = 0
t.hour
-> 4
t.utc?
-> true

Ближайший я пришел, но это не интуитивно.

t = DateTime.now
t.hour
-> 4
t += t.offset
t = t.utc
t.hour
-> 4
t.utc?
-> true

Есть ли лучший способ?

4b9b3361

Ответ 1

Используя Rails 3, вы ищете DateTime.change()

dt = DateTime.now
=> Mon, 20 Dec 2010 18:59:43 +0100
dt = dt.change(:offset => "+0000")
=> Mon, 20 Dec 2010 18:59:43 +0000

Ответ 2

Использование смещения числа, например. "+1000" не будет работать круглый год из-за дневного сбережения. Оформить заказ ActiveSupport:: TimeZone. Подробнее здесь

Ответ 3

Вместо этого я бы использовал объект Time. Итак, получите текущее местное время, а затем увеличьте его с помощью UTC offset и конвертируйте в UTC, например:

t = Time.now # or Time.parse(myDateTime.asctime)
t # => Thu Dec 16 21:07:48 -0800 2010
(t + t.utc_offset).utc # => Thu Dec 16 21:07:48 UTC 2010

Хотя, за комментарий к Phrogz, если вы просто хотите сохранить временные метки в независимом от местоположения образом, просто используйте текущее время UTC:

Time.now.utc

Ответ 4

d = DateTime.now
puts [ d, d.zone ]
#=> 2010-12-17T13:28:29-07:00
#=> -07:00

d2 = d.new_offset(3.0/24)
puts d2, d2.zone
#=> 2010-12-17T23:28:29+03:00
#=> +03:00

Изменить. Этот ответ не учитывает информацию, предоставленную комментарием, другому ответу, что желание изменить время часового пояса будет одинаковым после изменения часового пояса.

Ответ 5

Как указано @Sam, изменение смещения недостаточно и приведет к ошибкам. Чтобы быть устойчивым к достижениям часов DST, преобразование должно выполняться следующим образом:

d = datetime_to_alter_time_zone
time_zone = 'Alaska'

DateTime.new
  .in_time_zone(time_zone)
  .change(year: d.year, month: d.month, day: d.day, hour: d.hour, min: d.min, sec: d.sec)

Ответ 6

Если у кого-то (например, у меня) есть часовой пояс в строчном формате, например "Pacific Time (США и Канада)"

Чем это лучший способ, я нашел:

datetime.change(ActiveSupport::TimeZone[time_zone_string].formatted_offset(false)

Ответ 7

Вы можете указать часовой пояс, который вы хотите использовать в своем приложении, добавив следующую строку в конфигурационный файл (config/application.rb):   config.time_zone = 'Мумбаи'

Здесь вы можете найти официальную документацию: http://api.rubyonrails.org/classes/ActiveSupport/TimeZone.html

Другой вариант заключается в том, что вы "Monkey Patch" в классе DateTime.