перетворити String в DateTime


98

Мені потрібно проаналізувати наступний рядок в об’єкт DateTime:
30/Nov/2009:16:29:30 +0100

Чи є простий спосіб це зробити?

PS: Я хочу перетворити наведений вище рядок як є. Товста кишка після року - це не друкарня. Я також хочу вирішити проблему з Ruby, а не з RoR.

Відповіді:


99

DateTime.strptime дозволяє вказати формат і перетворити рядок у DateTime.


1
Дякую. Пропустив, що я міг би дати йому власний формат. Ось робочий: '% d /% b /% Y:% H:% M:% S'
SkaveRat

1
@SkaveRat Чи поважає ваш рядок часовий пояс? Я використовую%d/%b/%Y:%H:%M:%S %Z
кнут

4
Для переліку доступних абревіатур формату gist.github.com/halloffame/5350249
Ryan

8
Було б ввічливо вказати приклад перетворення рядка, про який запитував користувач, а не лише "іди читати туди" (де до речі тонни інформації). Stackoverflow популярний не тому, що дає посилання на зовнішню документацію, а дає відповіді на запитання
Даніель Гармошка

Чи є спосіб зробити "точну відповідність"? В даний час поведінка "збігається з самого початку", тому %Yбуде відповідати як 2015(як очікувалося), 2016-foo-barтак і припиняється, коли бачить 2016. Така поведінка відповідає аналогу С; однак функція C повертає позицію кінця відповідності (наприклад, першу -у випадку "2016"), щоб ми вирішили, чи відповідає відповідність; у Ruby він повертає a DateTime, тому ми не можемо сказати, чи є ще щось після цього.
Franklin Yu,

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, але удачі, з’ясувавши, які саме вибірково вимагати)
Matt Zukowski,

2
ActiveSupport викладено досить розумно, але для найменшого впливу це має бути все, що вам потрібно для to_datetimeдодавання до Stringоб’єктів:require 'active_support/core_ext/string/conversions'
xentek

3
Питання стосується "30 / Nov / 2009: 16: 29: 30 +0100", а не "30 / Nov / 2009 16:29:30 +0100". Це ще одна причина, чому це не працює.
schmijos


15

Я використовував Time.parse("02/07/1988"), як і деякі інші плакати.

Цікавим було те, що Timeбуло завантажено за замовчуванням, коли я відкрив IRB, але Time.parseне був визначений. Мені довелося require 'time'змусити його працювати.

Це з Ruby 2.2.


12

Це перетворить рядок у дату в дату і час:

"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.