2012-06-09 4 views
4

DateTime класса кажется излишним, и после прочтения этого бита в документации для расширения Rails класса, также представляется потенциально опасным:В чем смысл класса DateTime?

DateTimes не знают о правилах перехода на летнее время, поэтому используйте последовательный Некоммерческий -Dst смещение при создании DateTime со смещением в локальной зоне

Там же это, в документации Rails для DateTime#to_time:

попытки с превратить себя в объект Ruby Time; возвращает себя, если выходит за пределы диапазона Ruby Time. Если у меня есть смещение, отличное от 0, self будет просто возвращено без изменений, так как нет чистого способа сопоставить его с временем.

Я предполагаю, что последняя часть вызвана DateTime, не признавая DST.

Мне кажется, у нас это:

  • Date класс представляет собой простую дату без времени.
  • Класс Time представляет собой конкретный момент времени, который неявно включает дату.
  • Класс DateTime такой же, как класс Time, но не понимает DST и иногда не может преобразовать в обычный класс Time.

Нужно ли DateTime просто изгнать из базы кода или это послужит полезной цели, которой я не хватает?

+0

Я, как правило, согласен с вами в том, что обычно вам нужно время, а не DateTime ... Я только что работал с DateTime, потому что он уже был DateTime ... Я никогда не выбирал его. Это все немного беспорядка ИМО. – d11wtq

+0

Хорошо, есть один случай, когда требуется DateTime: из документации Rails для 'Time.time_with_datetime_fallback':« Возвращает новое время, если запрошенный год может быть размещен по классу Ruby's Time (т. Е. Если год находится в пределах 1970 года. 2038 или 1902..2038, в зависимости от архитектуры системы), в противном случае возвращает DateTime. " –

+0

Есть ли другой случай, когда 'DateTime' неизбежен? –

ответ

3

DateTime имел преимущество над Time на 32-битных машин в рубины < 1.9.2 - Time был жертвой Y2K38 problem и ограничивается 32 битный диапазон. Эта проблема решается либо на 64-битных машинах, либо в последних версиях Ruby. Вам все равно может понадобиться использовать DateTime, если, например, 1,8 совместимость является обязательной или вы полагаетесь на использование методов из своего API, которые часто отклоняются от значений Time.

+0

Отличный ответ, спасибо! Из любопытства вы знаете, какие новые пределы диапазона для «Время», если таковые имеются? –

+0

@Chris Судя по [источникам] (https://github.com/ruby/ruby/blob/trunk/time.c), похоже, что текущее поведение заключается в использовании 64-битной точности, когда это возможно (uint64_t или long long или все, что доступно). Я еще не разобрал точные данные, но я бы предположил, что, как показано в этой статье [Wikipedia] (http://en.wikipedia.org/wiki/Year_2038_problem), независимо от деталей реализации, t будет реальной проблемой с диапазонами больше при использовании 64 бит. – emboss

+1

Так что, похоже, нам не придется беспокоиться об этом снова до воскресенья, 4 декабря 292 277 026 596. Благодаря! –

Смежные вопросы