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

100

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

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

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

SkaveRat
источник

Ответы:

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
46

Я добился успеха с:

require 'time'
t = Time.parse(some_string)
Automatico
источник
15

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

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

Это с Ruby 2.2.

деклан
источник
12

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

"05/05/2012".to_time
user1425976
источник
20
Это метод Ruby on Rails, а не метод Ruby.
JackCA
1
Хотя это не был ответ на этот вопрос, он мне очень помог. Спасибо @ user1425976
karlingen
11

Для китайских разработчиков Rails:

DateTime.strptime('2012-12-09 00:01:36', '%Y-%m-%d %H:%M:%S')
=> Sun, 09 Dec 2012 00:01:36 +0000
Сивэй Шэнь 申思维
источник
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
К.М. Ракибул Ислам
источник