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.

Respuestas:


99

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


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

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)

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.


12

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

"05/05/2012".to_time

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

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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.