2014-11-22 2 views
5

У меня есть дата в виде строки в таком формате: 23 Nov. 2014. Конечно, это легко превратить эту строку в дату с таким выражением:Преобразование строки на сегодняшний день с Ruby

Date.strptime(my_string, '%d %b. %Y') 

Но есть одна проблема, когда месяц май - нет точек, как 23 May 2014. И мое выражение нарушается.

Может ли кто-нибудь помочь в решении этой проблемы? Как я могу сделать универсальное выражение для своих случаев?

ответ

3

Удалить период с my_string и с шаблона даты.

Date.strptime(my_string.sub('.', ''), '%d %b %Y') 

Это предполагает, что у вас есть более одной точки в my_string. Если их может быть несколько, используйте gsub.

Date.strptime(my_string.gsub('.', ''), '%d %b %Y') 
+1

Вместо 'sub' или' gsub' используйте 'tr ('.', '')'. Это быстрее и выполнит то же самое. –

+0

... или 'my_string.delete ('.')'. –

2

Я думаю, вы используете неправильный метод. Date#parse должен работать практически с «ничего» (см TINMAN ответа и комментарий для выяснения, когда не использовать парсер) и обеспечивает один и тот же объект:

p Date.parse('23 Nov 2014') #=> #<Date: 2014-11-23 ((2456985j,0s,0n),+0s,2299161j)> 
p Date.parse('23 Nov. 2014') #=> #<Date: 2014-11-23 ((2456985j,0s,0n),+0s,2299161j)> same object as with the previous line 
+2

Date parse не работает ни с чем, он на самом деле довольно ограничен, и медленнее, и подвержен ошибкам из-за различий в общих форматах дат между США и остальным миром. Вместо этого используйте 'strptime' для форматов даты, которые вы распознаете, и, возможно, отмените' parse'. Лучше всего знать настройку LOCALE пользователя или просто дать им указать из нескольких альтернатив и использовать это. –

+0

U.S. против «покоя» мира? Я нахожу это довольно элитарным взглядом. Мы говорим о МЕЖДУНАРОДНОМ формате даты здесь, если конкретная страна (например, США или любая другая) имеет свой конкретный способ представления дат, то вы не можете сказать, что метод разбора «не работает» только потому, что он не поддерживает некоторую реализацию страны X. – daremkd

+1

Нет ничего «элитарного», упомянутого или подразумеваемого. Наиболее распространенный формат даты в США отличается, и слишком много людей не знают об этом. Ruby, будучи международно-ориентированным языком, делает все правильно. Я думаю, что ваша политика раскрашивает, как вы читаете комментарий. –

0

Метод parse пытается найти соответствие даты или форматы даты и время, затем проанализируйте строку, чтобы вернуть значения, используемые для создания новой даты или даты. Существует множество различных форматов, которые он поддерживает, что удобно, однако процесс сканирования для поиска соответствия замедляет время синтаксического анализа.

Кроме того, некоторые используемые форматы не обязательно «подходят». Рассмотрим, что здесь происходит:

Date.parse '31/01/2001' 
=> #<Date: 2001-01-31 ((2451941j,0s,0n),+0s,2299161j)> 

дата строка в '%d/%m/%Y' (день, месяц, год) формат разбирается, хотя это не распространено в США, потому что Руби не США ориентированный язык. Обращение первых двух полей приводит к:

Date.parse '01/31/2001' 
ArgumentError: invalid date 
    from (irb):4:in `parse' 
    from (irb):4 
    from /Users/greg/.rbenv/versions/2.1.5/bin/irb:11:in `<main>' 
irb(main):005:0> Date.parse '31/01/2001' 
+0

Да, я вижу, спасибо! И я думаю, вы также рекомендуете мне удалить период из строки и использовать 'strptime'? – ktaras

+1

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

 Смежные вопросы

  • Нет связанных вопросов^_^