преобразовать String в DateTime


100

Мне нужно проанализировать следующую строку в объекте DateTime:
30/Nov/2009:16:29:30 +0100

Есть простой способ сделать это?

PS: я хочу преобразовать строку выше как есть. Двоеточие после года - это не опечатка. Еще я хочу решить проблему с Ruby, а не с RoR.

Ответы:


100

DateTime.strptime позволяет указать формат и преобразовать String в DateTime.


1
Спасибо. Пропустил, что я мог придать ему свой формат. Вот рабочий: '% d /% b /% Y:% H:% M:% S'
SkaveRat

1
@SkaveRat Уважает ли ваша строка часовой пояс? Я использую%d/%b/%Y:%H:%M:%S %Z
Кнут

4
Список доступных сокращений форматов gist.github.com/halloffame/5350249
Райан,

9
Было бы вежливо указать пример преобразования строки, которую просил пользователь, а не только «иди и прочти там» (где, кстати, тонны информации). Stackoverflow популярен не потому, что дает ссылки на внешнюю документацию, а дает ответы на вопросы,
Даниэль Гармошка,

Есть ли способ сделать «точное совпадение»? В настоящее время поведение «соответствие с начала», поэтому %Yбудет соответствовать как 2015(как и ожидалось), 2016-foo-barтак и остановится, когда увидит 2016. Это поведение согласуется с аналогом C; однако функция C возвращает позицию конца сопоставления (например, первую -в случае «2016»), чтобы мы могли решить, является ли совпадение точным; в Ruby он возвращает a DateTime, поэтому мы не можем сказать, осталось ли что-нибудь потом.
Франклин Ю

97

Разве это тоже не должно работать?

"30/Nov/2009 16:29:30 +0100".to_datetime

1
прекрасно работает в Rails 3.2.3 с использованием Ruby 1.9.3 ... "2012-05-16 02:30 UTC" .to_datetime => Среда, 16 мая 2012 г. 02:30:00 +0000
Тило

58
Это тоже метод Ruby on Rails, а не метод Ruby.
JackCA

5
Это должно быть: require 'active_support/all' а затем "30/Nov/2009 16:29:30 +0100".to_datetime (на самом деле вам не нужны все расширения active_support, но удачи в выяснении, какие из них требуются выборочно)
Мэтт Жуковски

2
ActiveSupport разработан довольно разумно, но для наименьшего воздействия это должно быть все, что вам нужно для to_datetimeдобавления к Stringобъектам:require 'active_support/core_ext/string/conversions'
xentek

3
Вопрос касается «30 / ноя / 2009: 16: 29: 30 +0100», а не «30 / ноя / 2009 16:29:30 +0100». Это еще одна причина, почему это не работает.
schmijos


15

Я использовал Time.parse("02/07/1988"), как и некоторые другие плакаты.

Интересная проблема заключалась в том, что Timeпри открытии IRB загружалась по умолчанию, но Time.parseне была определена. Я должен был require 'time'заставить его работать.

Это с Ruby 2.2.


12

Это преобразует строку в date в datetime:

"05/05/2012".to_time

20
Это метод Ruby on Rails, а не метод Ruby.
JackCA

1
Хотя это не был ответ на этот вопрос, он мне очень помог. Спасибо @ user1425976
karlingen


5

в Ruby 1.8 модуль ParseDate преобразует этот и многие другие форматы даты и времени. Однако он не совсем корректно обрабатывает двоеточие между годом и часом. Предположим, что двоеточие - это опечатка и на самом деле пробел, тогда:

#!/usr/bin/ruby1.8

require 'parsedate'

s = "30/Nov/2009 16:29:30 +0100"
p Time.mktime(*ParseDate.parsedate(s))    # =>  Mon Nov 30 16:29:30 -0700 2009

1

Вы также можете проанализировать строку даты и времени с заданным часовым поясом:

zone = "Pacific Time (US & Canada)"
ActiveSupport::TimeZone[zone].parse("2020-05-24 18:45:00")
=> Sun, 24 May 2020 18:45:00 PDT -07:00
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.