converter String em DateTime

98

Preciso analisar a seguinte string em um objeto DateTime:
30/Nov/2009:16:29:30 +0100

Existe uma maneira fácil de fazer isso?

PS: Quero converter a string acima como está. Os dois pontos após o ano não são um erro de digitação. Também quero resolver o problema com Ruby e não com RoR.

SkaveRat
fonte

Respostas:

99

DateTime.strptime permite especificar o formato e converter uma String em DateTime.

Kaleb Brasee
fonte
1
obrigado. Perdeu, que eu poderia dar meu próprio formato. Aqui está o que está funcionando: '% d /% b /% Y:% H:% M:% S'
SkaveRat
1
@SkaveRat Sua string respeita o fuso horário? Eu uso%d/%b/%Y:%H:%M:%S %Z
knut de
4
Para obter uma lista de abreviações de formato disponíveis gist.github.com/halloffame/5350249
Ryan,
8
Seria educado especificar exemplo de conversão de string, que o usuário pediu, não apenas "vá ler lá" (cadê toneladas de informações por falar nisso). Stackoverflow popular não porque fornece links para documentação externa, mas dá respostas a perguntas
Daniel Garmoshka
Existe alguma maneira de fazer "correspondência exata"? Atualmente, o comportamento é "combinando desde o início", então %Yirá corresponder a ambos 2015(como esperado) e 2016-foo-barjá que para quando vê 2016. Esse comportamento é consistente com a contraparte C; no entanto, a função C retorna a posição do final da correspondência (por exemplo, a primeira -no caso "2016") para decidirmos se a correspondência é exata; em Ruby ele retorna um DateTime, então não podemos dizer se ainda há algo depois.
Franklin Yu
97

Isso também não deveria funcionar?

"30/Nov/2009 16:29:30 +0100".to_datetime
xentek
fonte
1
funciona bem no Rails 3.2.3 usando Ruby 1.9.3 ... "2012-05-16 02:30 UTC" .to_datetime => Quarta, 16 de maio de 2012 02:30:00 +0000
Tilo
58
Este também é um método Ruby on Rails, não um método Ruby.
JackCA
5
Deve ser: require 'active_support/all' e então "30/Nov/2009 16:29:30 +0100".to_datetime (você não precisa de todas as extensões active_support, mas boa sorte para descobrir quais requerer seletivamente)
Matt Zukowski
2
ActiveSupport é bem organizado, mas para o mínimo de impacto, isso deve ser tudo que você precisa para ser to_datetimeadicionado aos Stringobjetos:require 'active_support/core_ext/string/conversions'
xentek
3
A pergunta é sobre "30 / Nov / 2009: 16: 29: 30 +0100" e não "30 / Nov / 2009 16:29:30 +0100". Esse é outro motivo pelo qual não funciona.
schmijos
45

Tive sucesso com:

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

Usei Time.parse("02/07/1988"), como alguns dos outros pôsteres.

Uma pegadinha interessante foi que Timefoi carregado por padrão quando abri o IRB, mas Time.parsenão foi definido. Eu tinha require 'time'que fazer funcionar.

Isso é com Ruby 2.2.

declinar
fonte
12

Isso converterá a string de data em data e hora:

"05/05/2012".to_time
user1425976
fonte
20
Este é um método Ruby on Rails, não um método Ruby.
JackCA
1
Embora essa não fosse a resposta para essa pergunta, ela me ajudou muito. Obrigado @ user1425976
karlingen
10

Para desenvolvedores Rails chineses:

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

no Ruby 1.8, o módulo ParseDate converterá este e muitos outros formatos de data / hora. No entanto, não lida bem com os dois pontos entre o ano e a hora. Supondo que dois pontos seja um erro de digitação e, na verdade, um espaço, então:

#!/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
fonte
1

Você também pode analisar uma string de data e hora com um determinado fuso horário:

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
fonte