Дата-время.сейчас или Time.now?

#ruby-on-rails #ruby #time #timezone

#ruby-on-rails #ruby #время #Часовой пояс

Вопрос:

Какой из двух я должен использовать в своем приложении Rails:

 DateTime.now or Time.now
  

Есть ли какой-либо вред в использовании обоих в приложении?

Могут ли когда-либо быть какие-либо различия между ними в случае приведенного выше ( now ) примера? (В моей текущей системе они оба показывают одно и то же время)

Комментарии:

1. ActiveRecord и другие ORM, такие как DateTime и Date для своих записей в базе данных. Я думаю, это потому, что диапазон Date больше, чем Time. Время основано на представлениях операционной системы о времени и, если я помню, лучше интегрируется с информацией о часовом поясе. Возможно, вы захотите рассмотреть home_run как альтернативу, которая должна быть намного быстрее.

Ответ №1:

Используйте (Date)Time.current вместо (Date)Time.now

Rails расширяет объекты Time и DateTime и включает current свойство для получения времени, установленного в среде Rails (по умолчанию = UTC), в отличие от времени сервера (может быть любым).

Это очень важно — вы всегда должны работать по времени UTC, за исключением случаев преобразования между часовыми поясами для пользовательского ввода или отображения — но многие производственные системы по умолчанию используют не UTC. (например, Heroku установлен в PST (GMT -8))

Смотрите статью здесь

Комментарии:

1. @user2503775 — Да, вы могли бы использовать это, но если по какой-то причине вы действительно хотите работать в часовом поясе, отличном от UTC (что, я думаю, никогда не является хорошей идеей), по крайней мере, вы могли бы внести изменения, переключив переменную среды вместо того, чтобы менять кучу значений в коде.

2. @Yarin используй Time.zone.now вместо Time.current вместо Time.now

3. @ajahongir Time.current возвращает Time.zone.now, если зона установлена, если нет, то возвращает Time.now

4. current помогает избежать записи Time.now.zone , но это не решает проблему с потенциальным добавлением долей секунды, как указывает ответ @slandau.

5. Насколько я понимаю, active record всегда преобразует datetime в UTC, прежде чем сохранять его в поле datetime. Не является ли лучшей политикой просто работать в текущем часовом поясе и позволить rails magic выполнять эти преобразования за кулисами?

Ответ №2:

По ссылке на Time.now (не DateTime.now ):

Созданный объект будет создан с использованием разрешения, доступного на ваших системных часах, и поэтому может включать доли секунды.

 a = Time.new      #=> Wed Apr 09 08:56:03 CDT 2003
b = Time.new      #=> Wed Apr 09 08:56:03 CDT 2003
a == b            #=> false
"%.6f" % a.to_f   #=> "1049896563.230740"
"%.6f" % b.to_f   #=> "1049896563.231466"
  

Комментарии:

1. Да, дробные секунды могут выглядеть плохо, если вы их не ожидаете, но затем могут быть усечены, если вы хотите, путем преобразования секунд в целое значение или с помощью strftime их форматирования с сохранением для любой математической метки времени.

2. Я работаю с Rails 3, и DateTime также имеет доли секунды. Это различие присутствует только в Rails 2?

Ответ №3:

Если вы хотите узнать время в часовом поясе приложения, вам нужно вызвать Time.zone.now , так что это то, что я обычно использую.

Time.now и DateTime.now оба возвращают время по системному времени, которое часто устанавливается равным UTC.

Комментарии:

1. В качестве альтернативы используйте (Date) Time.current , как предложил Yarin. Time.current вернет Time.zone.now, если задано значение Time.zone, else вернет Time.now.