Ruby Enterprise Edition дает время. теперь в неправильном формате

#ruby-on-rails #ruby #ruby-on-rails-3 #locale #ruby-enterprise-edition

#ruby-on-rails #ruby #ruby-on-rails-3 #язык #ruby-enterprise-edition

Вопрос:

На моем VPS (Ubuntu 10.04LTS) у меня установлены ree-1.8.7-2011.03 и ruby-1.9.2-p180 через RVM. Моя проблема в том, что когда я вызываю Time.now в ree-1.8.7 (irb), я получаю Thu May 12 12:16:50 0200 2011 , когда я делаю то же самое в ruby-1.9.2 (irb), я получаю 2011-05-12 12:17:44 0200 .

Проблема в том, что ree-версия даты непригодна для использования в моих запросах rails (Сгенерированный SQL просто не работает). Форматирование времени с использованием strftime в каждом отдельном запросе на данный момент невозможно, и ни один из них не переходит на 1.9.2, поэтому мне нужна ваша помощь, чтобы выяснить, почему это происходит, и исправить это.

Спасибо за любую помощь!

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

1. Как вы передаете даты в запросы? Вы не используете интерполяцию параметров AR?

2. В большинстве случаев да, но некоторые из более крупных запросов намного легче читать, когда я использую интерполяцию строк.

3. Хорошо, просто помните, что вы также можете использовать :name форму с хэшем вместо ? массива. Достаточно читаемый, даже больше, чем обычная интерполяция строк IMO.

4. Спасибо, я знал об этом некоторое время, но я еще не использовал его. Я попробую и посмотрю, как это выглядит. Спасибо!

Ответ №1:

Это не проблема REE. Ruby 1.9.2 изменяет формат времени по умолчанию #на_s.

 $ rvm use 1.8.7
ruby-1.8.7-p334 :001 > Time.now
# => Thu May 12 12:42:35  0200 2011 

$ rvm use 1.9.2
ruby-1.9.2-p180 :001 > Time.now
# => 2011-05-12 12:42:44  0200 
  

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

Форматирование времени с использованием strftime в каждом отдельном запросе на данный момент не является вариантом

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

Временным обходным решением было бы переопределить метод Ruby 1.8.7 Time#to_s для использования пользовательского формата. Однако внесение такого изменения может привести к поломке других библиотек.

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

1. Спасибо, я вроде как пришел к тому же выводу за последние несколько минут, думал, что понятия не имел об этом изменении между 1.8 и 1.9. Теперь я знаю, что должен использовать strftime, только это был не немедленный вариант.

2. Но есть ли разница между чередованием времени в предложении where с #{Time.now} в строке и выполнением замены «?»?

Ответ №2:

Как насчет чего-то подобного в вашем config / initializers / app.rb

 Time::DATE_FORMATS[:default] = "Your preferred date format"
  

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

1. Установка Time::DATE_FORMATS[:default]= «%F %T %Z» в моем инициализаторе не имела никакого эффекта, но неважно, я решил использовать strftime во всех своих запросах, как указано Симоной Карлетти. Спасибо!