[Изменить июль 2018]
Все вышеперечисленное все еще верно в Ruby 2.5.1. Из справочной документации :
DateTime не учитывает никаких високосных секунд, не отслеживает никаких правил летнего времени.
То, что не было отмечено в этой теме ранее, является одним из немногих преимуществ DateTime
: он осведомлен о календарных реформах, тогда как Time
- это не:
[…] Класс Time в Ruby реализует логический григорианский календарь и не имеет понятия о реформе календаря […].
Справочная документация заканчивается рекомендацией использовать Time
при работе исключительно с датами / временем ближайшего, текущего или будущего и использовать DateTime
только тогда, когда, например, день рождения Шекспира должен быть точно преобразован: (выделение добавленное) * * тысяча двадцать-одна
Итак, когда вы должны использовать DateTime в Ruby и когда вы должны использовать Time? Почти наверняка вам захочется использовать Time, поскольку ваше приложение, вероятно, имеет дело с текущими датами и временем. Однако, если вам нужно иметь дело с датами и временем в историческом контексте, вы захотите использовать DateTime […]. Если вам также приходится иметь дело с часовыми поясами, тогда удачи - просто имейте в виду, что вы, вероятно, будете иметь дело с местным солнечным временем, поскольку только в 19 веке введение железных дорог потребовало стандартного времени. и в конечном итоге часовые пояса.
[/ Edit Июль 2018]
Начиная с ruby 2.0, большая часть информации в других ответах устарела.
В частности, Time
теперь практически не связан. Он может быть больше или меньше 63 бит от Epoch:
irb(main):001:0> RUBY_VERSION
=> "2.0.0"
irb(main):002:0> Time.at(2**62-1).utc # within Integer range
=> 146138514283-06-19 07:44:38 UTC
irb(main):003:0> Time.at(2**128).utc # outside of Integer range
=> 10783118943836478994022445751222-08-06 08:03:51 UTC
irb(main):004:0> Time.at(-2**128).utc # outside of Integer range
=> -10783118943836478994022445747283-05-28 15:55:44 UTC
Единственным последствием использования больших значений должна быть производительность, которая лучше при использовании Integer
с (против Bignum
с (значения вне диапазона Integer
) или Rational
с (когда отслеживаются наносекунды) )):
Начиная с Ruby 1.9.2, реализация Time использует 63-разрядное целое число со знаком, Bignum или Rational. Целое число - это число наносекунд, начиная с эпохи, которое может представлять 1823-11-12 до 2116-02-20. Когда используется Bignum или Rational (до 1823, после 2116, в течение наносекунды), время работает медленнее, чем при использовании целого числа.
(http://www.ruby -doc.org / ядро-2.1.0 / Time.html )
Другими словами, насколько я понимаю, DateTime
больше не охватывает более широкий диапазон потенциальных значений, чем Time
.
Кроме того, следует отметить два ранее не упомянутых ограничения DateTime
:
DateTime не учитывает никаких скачков, не отслеживает правила летнего времени.
(http://www.ruby -doc.org / STDLIB-2.1.0 / libdoc / дата / RDoc / Date.html # класс-Date-метка-DateTime )
Во-первых, DateTime
не имеет понятия високосных секунд:
irb(main):001:0> RUBY_VERSION
=> "2.0.0"
irb(main):002:0> require "date"
=> true
irb(main):003:0> t = Time.new(2012,6,30,23,59,60,0)
=> 2012-06-30 23:59:60 +0000
irb(main):004:0> dt = t.to_datetime; dt.to_s
=> "2012-06-30T23:59:59+00:00"
irb(main):005:0> t == dt.to_time
=> false
irb(main):006:0> t.to_i
=> 1341100824
irb(main):007:0> dt.to_i
=> 1341100823
Во-вторых, DateTime
имеет очень ограниченное понимание часовых поясов и, в частности, не имеет понятия летнего времени . Он в значительной степени обрабатывает часовые пояса как простые смещения UTC + X:
irb(main):001:0> RUBY_VERSION
=> "2.0.0"
irb(main):002:0> require "date"
=> true
irb(main):003:0> t = Time.local(2012,7,1)
=> 2012-07-01 00:00:00 +0200
irb(main):004:0> t.zone
=> "CEST"
irb(main):005:0> t.dst?
=> true
irb(main):006:0> dt = t.to_datetime; dt.to_s
=> "2012-07-01T00:00:00+02:00"
irb(main):007:0> dt.zone
=> "+02:00"
irb(main):008:0> dt.dst?
NoMethodError: undefined method `dst?' for #<DateTime:0x007f34ea6c3cb8>
Это может вызвать проблемы, когда времена вводятся как DST, а затем преобразуются в часовой пояс не-DST без отслеживания правильных смещений за пределами самого DateTime
(многие операционные системы уже могут позаботиться об этом за вас) .
В целом, я бы сказал, что в настоящее время Time
- лучший выбор для большинства приложений.
Также обратите внимание на важное отличие при добавлении: когда вы добавляете число к объекту Time, оно считается в секундах, а когда вы добавляете число в DateTime, оно считается в днях.