convertire String in DateTime


98

Ho bisogno di analizzare la seguente stringa in un oggetto DateTime:
30/Nov/2009:16:29:30 +0100

C'è un modo semplice per farlo?

PS: voglio convertire la stringa sopra così com'è. I due punti dopo l'anno non sono un errore di battitura. Voglio anche risolvere il problema con Ruby e non con RoR.

Risposte:


99

DateTime.strptime consente di specificare il formato e convertire una stringa in un DateTime.


1
Grazie. Mancato, che avrei potuto dargli il mio formato. Ecco quello funzionante: '% d /% b /% Y:% H:% M:% S'
SkaveRat

1
@SkaveRat La tua stringa rispetta il fuso orario? Io uso%d/%b/%Y:%H:%M:%S %Z
knut

4
Per un elenco delle abbreviazioni di formato disponibili gist.github.com/halloffame/5350249
Ryan

8
Sarebbe cortese specificare un esempio di conversione di stringa, che l'utente ha chiesto, non solo "vai a leggere lì" (dove ci sono tonnellate di informazioni tra l'altro). Stackoverflow è popolare non perché fornisce collegamenti a documentazione esterna, ma fornisce risposte alle domande
Daniel Garmoshka

Esiste un modo per eseguire la "corrispondenza esatta"? Attualmente il comportamento è "corrispondente dall'inizio", quindi %Ycorrisponderà a entrambi 2015(come previsto) e 2016-foo-barpoiché si interrompe quando vede 2016. Questo comportamento è coerente con la controparte C; tuttavia, la funzione C restituisce la posizione della fine della corrispondenza (ad esempio la prima -nel caso "2016") per consentirci di decidere se la corrispondenza è esatta; in Ruby restituisce a DateTime, quindi non possiamo dire se c'è ancora qualcosa dopo.
Franklin Yu

97

Non dovrebbe funzionare anche questo?

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

1
funziona bene in Rails 3.2.3 usando Ruby 1.9.3 ... "2012-05-16 02:30 UTC" .to_datetime => Mercoledì, 16 maggio 2012 02:30:00 +0000
Tilo

58
Anche questo è un metodo Ruby on Rails, non un metodo Ruby.
JackCA

5
Questo dovrebbe essere: require 'active_support/all' e quindi "30/Nov/2009 16:29:30 +0100".to_datetime (in realtà non hai bisogno di tutte le estensioni active_support, ma buona fortuna per capire quali richiedere in modo selettivo)
Matt Zukowski

2
ActiveSupport è strutturato in modo abbastanza sano, ma per il minimo impatto, questo dovrebbe essere tutto ciò di cui hai bisogno per essere to_datetimeaggiunto agli Stringoggetti:require 'active_support/core_ext/string/conversions'
xentek

3
La domanda riguarda "30 / Nov / 2009: 16: 29: 30 +0100" e non "30 / Nov / 2009 16:29:30 +0100". Questo è un altro motivo per cui non funziona.
schmijos

46

Ho avuto successo con:

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

15

Ho usato Time.parse("02/07/1988"), come alcuni degli altri poster.

Un trucco interessante era che Timeveniva caricato di default quando ho aperto IRB, ma Time.parsenon era definito. Ho dovuto require 'time'farlo funzionare.

Questo è con Ruby 2.2.


12

Questo convertirà la stringa in data in datetime:

"05/05/2012".to_time

20
Questo è un metodo Ruby on Rails, non un metodo Ruby.
JackCA

1
Sebbene questa non fosse la risposta a questa domanda, mi ha aiutato molto. Grazie @ user1425976
karlingen

10

Per gli sviluppatori di Rails cinesi:

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

5

in Ruby 1.8, il modulo ParseDate convertirà questo e molti altri formati di data / ora. Tuttavia, non si occupa con grazia del colon tra l'anno e l'ora. Supponendo che i due punti siano un errore di battitura e in realtà uno spazio, allora:

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

Puoi anche analizzare una stringa di data e ora con un determinato fuso orario:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.