Rails: заполнение базы данных и формат даты - PullRequest
11 голосов
/ 29 марта 2011

Я пытаюсь вставить некоторые данные в разрабатываемое мной приложение Rails 3, используя файл db / seed.rb и команду rake db: seed.

Данные, которые я загружаювключает в себя таблицу базы данных с именем Meeting, которая имеет три столбца: заголовок строки, datetime startDate, datetime endDate.Даты, которые я пытаюсь вставить, указаны в формате «мм / дд / гггг чч: мм», например.«02.01.2003 13:23» = 2 января 2003 г. 13:23.Однако DateTime.parse () постоянно выдает ошибку «недопустимая дата» - поскольку он пытается проанализировать даты в формате «дд / мм / гггг».

Из моего поиска в Google, я 'Мы верили, что при разборе объектов DateTime компилятор смотрит на переданную строку и выполняет какое-то поспешное сопоставление с шаблоном, а затем отображает «mm / dd / yyyy» и «dd-mm-yyyy» соответственно для американцев / британцев (и т. д.).) стандарты, основанные на том, использовался ли в качестве разделителя слэш или тире.Однако, похоже, это не так, и мне интересно, почему.И как это исправить.

Вот так я заполняю Собрания - первое правильно разбирает, второе не удается.

Meeting.create([
  {
    :title => "This meeting parses fine",
    :startDate => DateTime.parse("09/01/2009 17:00"),
    :endDate => DateTime.parse("09/01/2009 19:00")
  },
  {
    :title => "This meeting errors out",
    :startDate => DateTime.parse("09/14/2009 8:00")
    :endDate => DateTime.parse("09/14/2009 9:00")
  }])

Ответы [ 3 ]

12 голосов
/ 29 марта 2011

Вы можете попробовать Date.strptime

:startDate => DateTime.parse("09/14/2009 8:00") 
#=> 
:startDate => DateTime.strptime("09/14/2009 8:00", "%m/%d/%Y %H:%M")

так

Meeting.create([
  {
    :title => "This meeting parses fine",
    :startDate => DateTime.strptime("09/01/2009 17:00", "%m/%d/%Y %H:%M"),
    :endDate => DateTime.strptime("09/01/2009 19:00", "%m/%d/%Y %H:%M")
  },
  {
    :title => "This meeting errors out",
    :startDate => DateTime.strptime("09/14/2009 8:00", "%m/%d/%Y %H:%M")
    :endDate => DateTime.strptime("09/14/2009 9:00", "%m/%d/%Y %H:%M")
  }])
9 голосов
/ 29 марта 2011

Используйте DateTime.new вместо. Не беспокойтесь о правильном разборе.

Meeting.create([
  {
    :title      => "This meeting parses fine",
    :startDate  => DateTime.new(2009,9,1,17),
    :endDate    => DateTime.new(2009,9,1,19)
  },
  {
    :title      => "This meeting errors out",
    :startDate  => DateTime.new(2009,9,14,8),
    :endDate    => DateTime.new(2009,9,14,9)
  }
])
2 голосов
/ 23 марта 2016

Если специфика введенного времени не важна, вы можете полностью пропустить форматирование с помощью:

Time.now.to_datetime
Time.now.to_datetime.end_of_day
...