convertir String a DateTime

98

Necesito analizar la siguiente cadena en un objeto DateTime:
30/Nov/2009:16:29:30 +0100

¿Hay una forma fácil de hacer esto?

PD: Quiero convertir la cadena de arriba como está. Los dos puntos después del año no son un error tipográfico. También quiero resolver el problema con Ruby y no con RoR.

SkaveRat
fuente

Respuestas:

99

DateTime.strptime le permite especificar el formato y convertir un String en un DateTime.

Kaleb Brasee
fuente
1
Gracias. Echaba de menos que pudiera darle mi propio formato. Aquí está el que funciona: '% d /% b /% Y:% H:% M:% S'
SkaveRat
1
@SkaveRat ¿Tu cadena respeta la zona horaria? Yo uso%d/%b/%Y:%H:%M:%S %Z
knut
4
Para obtener una lista de las abreviaturas de formato disponibles, gist.github.com/halloffame/5350249
Ryan
8
Sería de buena educación especificar un ejemplo de conversión de cadena, que el usuario pidió, no solo "ir a leer allí" (donde hay toneladas de información por cierto). Stackoverflow es popular no porque proporcione enlaces a documentación externa, sino porque da respuestas a preguntas
Daniel Garmoshka
¿Hay alguna forma de hacer una "coincidencia exacta"? Actualmente el comportamiento es "coincidir desde el principio", por %Ylo que coincidirá con ambos 2015(como se esperaba) y 2016-foo-barya que se detiene cuando ve 2016. Este comportamiento es consistente con la contraparte de C; sin embargo, la función C devuelve la posición del final de la coincidencia (por ejemplo, la primera -en el caso "2016") para que decidamos si la coincidencia es exacta; en Ruby devuelve un DateTime, por lo que no podemos decir si todavía hay algo después.
Franklin Yu
97

¿No debería funcionar esto también?

"30/Nov/2009 16:29:30 +0100".to_datetime
xentek
fuente
1
funciona bien en Rails 3.2.3 usando Ruby 1.9.3 ... "2012-05-16 02:30 UTC" .to_datetime => Mié, 16 de mayo de 2012 02:30:00 +0000
Tilo
58
Este también es un método Ruby on Rails, no un método Ruby.
JackCA
5
Esto debería ser: require 'active_support/all' y luego "30/Nov/2009 16:29:30 +0100".to_datetime (en realidad no necesita todas las extensiones active_support, pero buena suerte para averiguar cuáles requerir de forma selectiva)
Matt Zukowski
2
ActiveSupport se presenta de manera bastante sensata, pero para lograr el menor impacto posible, esto debería ser todo lo que necesita para to_datetimeagregarse a los Stringobjetos:require 'active_support/core_ext/string/conversions'
xentek
3
La pregunta es sobre "30 / Nov / 2009: 16: 29: 30 +0100" y no "30 / Nov / 2009 16:29:30 +0100". Ésa es otra razón por la que no funciona.
schmijos
46

He tenido éxito con:

require 'time'
t = Time.parse(some_string)
Automatico
fuente
15

solía Time.parse("02/07/1988") , como algunos de los otros carteles.

Un problema interesante fue que Timese cargó de forma predeterminada cuando abrí IRB, pero Time.parseno estaba definido. Tuve querequire 'time' que hacerlo funcionar.

Eso es con Ruby 2.2.

declan
fuente
12

Esto convertirá la cadena en fecha a fecha y hora:

"05/05/2012".to_time
usuario1425976
fuente
20
Este es un método Ruby on Rails, no un método Ruby.
JackCA
1
Aunque esta no fue la respuesta a esta pregunta, me ayudó mucho. Gracias @ user1425976
karlingen
10

Para los desarrolladores de Rails chinos:

DateTime.strptime('2012-12-09 00:01:36', '%Y-%m-%d %H:%M:%S')
=> Sun, 09 Dec 2012 00:01:36 +0000
Siwei Shen 申思维
fuente
5

en Ruby 1.8, el módulo ParseDate convertirá este y muchos otros formatos de fecha / hora. Sin embargo, no trata con gracia los dos puntos entre el año y la hora. Suponiendo que los dos puntos son un error tipográfico y en realidad son un espacio, entonces:

#!/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
Wayne Conrad
fuente
1

También puede analizar una cadena de fecha y hora con una zona horaria determinada:

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
KM Rakibul Islam
fuente