Rails: данные базы данных посева и форматы дат

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

Данные, которые я посеял, включают таблицу базы данных, называемую Meeting, которая имеет три столбца: название строки, datetime startDate, datetime endDate. Время, которое я пытаюсь вставить, находится в формате "мм/дд/гггг. Чч: мм" - например. "01/02/2003 13:23" = 2 января 2003 года 13:23. Тем не менее, DateTime.parse() постоянно выдает ошибку с ошибкой "неверная дата" - при попытке проанализировать даты в формате "dd/mm/yyyy".

Из моего Googling я был убежден, что при анализе объектов 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")
  }])

Ответ 1

Вы можете попробовать 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")
  }])

Ответ 2

Используйте 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)
  }
])

Ответ 3

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

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