2012-06-05 7 views
3

Я использую календарь js, который вставляет строку в текстовое поле для представления в качестве значения даты и времени. Не уверен, если это имеет значение, но я использую SQLite на данный момент.Как установить формат даты в Rails

Я устанавливаю формат следующим образом (в инициализаторе):

Time::DATE_FORMATS[:default] = '%m/%d/%Y %H:%M' 
Time::DATE_FORMATS[:db] = '%m/%d/%Y %H:%M' 

Это не работает, потому что Rails, по-видимому проверки даты, используя другой формат.

Например, если установить его следующим образом:

myobject.my_datetime = '06/30/2012 00:00' 

он заканчивает нуль (в SQL запрос сам сгенерированный ActiveRecord устанавливает его в NULL). Если я установил его на день, меньший или равный 12, то дата вернется правильно (но сгенерированный SQL-запрос по-прежнему показывает строку с днем ​​до месяца, т. Е. В приведенном выше примере SQL-запрос имеет строку как '30/06/2012 05: 00: 000000 ').

Как вы можете видеть, это также добавляет 5 часов для UTC (?), Хотя у меня есть config.time_zone, установленный в восточное время.

Поведение одинаково либо с консоли, либо с помощью отправки формы.

Любые предложения по поводу того, что мне не хватает?

UPDATE:

Когда я последовать совету JDoe и сделать это:

myobject.my_datetime = Time.strptime ('06/30/2012 8:00' , «% м /% d /% Y% H:% M ')

Сформированный запрос теперь выглядит правильно (без учета разницы в 4 часа):

UPDATE "myjoin_table" SET "my_datetime" = '06/30/2012 04:00.000000' ..... 

и завершаться в базе данных таким образом.

Но когда я перезагружаю объект, значение в объекте AR инициализируется нулем.

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

ответ

6

ActiveRecord хранит дату/время в UTC + 00: 00. Если вы живете в зоне +5, ActiveRecord вычитает 5 часов при назначении автоматически. Таким образом, ваш текущий часовой пояс просто говорит, сколько часов должно быть добавлено/вычтено из вашего местного времени.

О разборе. Вы попробовали следующее?

myobject.my_datetime = Time.strptime('06/30/2012 00:00', '%m/%d/%Y %H:%M') 

Установки времени/даты Rails предназначены для показа, а не для назначения. Это не блестящая идея получить строки от пользователя и назначить их атрибутам даты/времени. Лучше использовать правильные временные объекты при назначении вместо укусов. Метод strptime поднимет ArgumentError, если какой-то пользователь пытается стать хакером. Ваш record.date_time='string' не работает.


UPD: Пример использования

p = Product.first 
p.last_visited = Time.strptime('06/30/2012 00:00', '%m/%d/%Y %H:%M') 
p.save # leads to UPDATE "products" SET "last_visited" = '2012-06-29 21:00:00.000000' 
Product.last_visited.localtime.strftime('%m/%d/%Y %H:%M') # => "06/30/2012 00:00" 

Как вы видите, время хранится и извлекается без каких-либо проблем.

UPD 2: I18n

Найдите config/locales/en.yml. Добавьте к нему следующий:

en: 
    time: 
    formats: 
     default: '%m/%d/%Y %H:%M' 

Чтобы разобрать ваше время использовать t (или translate) помощника:

@time = Time.strptime('06/30/2012 00:00', t('time.formats.default')) 

Использование l (или localize) помощник, чтобы показать время в вашем формате:

= l @time 
+0

Теперь я понимаю, что настройка конфигурации предназначена только для показа. Я не получаю строку от пользователя. Я включил только достаточную информацию для описания проблемы, которая воспроизводится на консоли, передавая строку, аналогичную тому, как моя форма это делает (продолжение). –

+0

Пожалуйста, ознакомьтесь с вопросом обновления. –

+0

@KenThompson См. UPD для примера использования. – jdoe