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