К сожалению, функции DateTime.to_time, Time.to_datetime
и Time.parse
не сохраняют информацию о часовом поясе. Все преобразовано в местный часовой пояс во время преобразования. Арифметика дат все еще работает, но вы не сможете отображать даты с их исходными часовыми поясами. Эта контекстная информация часто важна. Например, если я хочу видеть транзакции, совершаемые в рабочее время в Нью-Йорке, я, вероятно, предпочитаю, чтобы они отображались в их исходных часовых поясах, а не в моем местном часовом поясе в Австралии (который на 12 часов опережает Нью-Йорк).
Приведенные ниже методы преобразования сохраняют эту информацию tz.
Для Ruby 1.8 посмотрите ответ Гордона Уилсона . Это из старой доброй надежной рубиновой поваренной книги.
Для Ruby 1.9 это немного проще.
require 'date'
# Create a date in some foreign time zone (middle of the Atlantic)
d = DateTime.new(2010,01,01, 10,00,00, Rational(-2, 24))
puts d
# Convert DateTime to Time, keeping the original timezone
t = Time.new(d.year, d.month, d.day, d.hour, d.min, d.sec, d.zone)
puts t
# Convert Time to DateTime, keeping the original timezone
d = DateTime.new(t.year, t.month, t.day, t.hour, t.min, t.sec, Rational(t.gmt_offset / 3600, 24))
puts d
Это печатает следующее
2010-01-01T10:00:00-02:00
2010-01-01 10:00:00 -0200
2010-01-01T10:00:00-02:00
Сохраняется полная исходная информация DateTime, включая часовой пояс.