2010-02-04 15 views
69

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

¿Hay una manera fácil de hacer esto?

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

+0

es el colon entre el año y la hora de un error tipográfico? –

+0

no, no es un error tipográfico – SkaveRat

Respuesta

82

DateTime.strptime le permite especificar el formato y convertir una Cadena en DateTime.

+1

gracias. Perdido, que podría darle mi propio formato. Aquí está el trabajo: '% d /% b /% Y:% H:% M:% S' – SkaveRat

+1

@SkaveRat ¿Su cadena respeta la zona horaria? Yo uso '% d /% b /% Y:% H:% M:% S% Z' – knut

+4

Para obtener una lista de abreviaturas de formato disponibles https://gist.github.com/halloffame/5350249 – Ryan

5

en Ruby 1.8, el módulo ParseDate convertirá este y muchos otros formatos de fecha/hora. Sin embargo, no trata con gracia el colon entre el año y la hora. Suponiendo que el colon es un error tipográfico y en realidad es 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 
66

¿No debería funcionar también?

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

No funciona, acabo de probarlo – Jacob

+0

Continua para mí en mri ruby ​​1.9.2, probablemente debería haber mencionado eso cuando publiqué el fragmento. – xentek

+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

7

Esto convertirá la cadena en la fecha a fecha y hora: el éxito

"05/05/2012".to_time 
+14

Este es un método de Ruby on Rails, no un método de Ruby. – JackCA

+0

Aunque esta no fue la respuesta a esta pregunta, me ayudó un montón. Gracias @ user1425976 – karlingen

30

que he tenido con:

require 'time' 
t = Time.parse(some_string) 
+0

¡Excelente respuesta! :) –

12

que utilizan Time.parse("02/07/1988"), al igual que algunos de los otros carteles.

Un interesante problema fue que Time se cargó por defecto cuando abrí IRB, pero Time.parse no estaba definido. Tuve que llamar al require 'time' para que funcione.

Eso es con Ruby 2.2.

4

Para los desarrolladores Rails chino:

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