ubah String menjadi DateTime

98

Saya perlu mengurai String berikut menjadi Objek DateTime:
30/Nov/2009:16:29:30 +0100

Adakah cara mudah untuk melakukan ini?

PS: Saya ingin mengubah string di atas apa adanya. Titik dua setelah tahun bukanlah salah ketik. Saya juga ingin menyelesaikan masalah dengan Ruby dan bukan RoR.

SkaveRat
sumber

Jawaban:

99

DateTime.strptime memungkinkan Anda untuk menentukan format dan mengonversi String menjadi DateTime.

Kaleb Brasee
sumber
1
Terima kasih. Merindukan, saya bisa memberikannya format saya sendiri. Ini yang berhasil: '% d /% b /% Y:% H:% M:% S'
SkaveRat
1
@SkaveRat Apakah string Anda menghormati zona waktu? Saya menggunakan%d/%b/%Y:%H:%M:%S %Z
knut
4
Untuk daftar singkatan format yang tersedia gist.github.com/halloffame/5350249
Ryan
8
Akan lebih sopan untuk menentukan contoh konversi string, yang diminta pengguna, tidak hanya "baca di sana" (di mana banyak informasi omong-omong). Stackoverflow populer bukan karena memberikan tautan ke dokumentasi eksternal, tetapi memberikan jawaban atas pertanyaan
Daniel Garmoshka
Apakah ada cara untuk melakukan "pencocokan tepat"? Saat ini perilakunya "cocok dari awal", jadi %Yakan cocok dengan keduanya 2015(seperti yang diharapkan) dan 2016-foo-barkarena berhenti saat dilihat 2016. Perilaku ini konsisten dengan rekan C; namun, fungsi C mengembalikan posisi akhir pencocokan (misalnya yang pertama -dalam kasus "2016") bagi kita untuk memutuskan apakah kecocokan tersebut tepat; di Ruby ia mengembalikan a DateTime, jadi kita tidak tahu apakah masih ada sesuatu setelahnya.
Franklin Yu
97

Bukankah ini juga harus berhasil?

"30/Nov/2009 16:29:30 +0100".to_datetime
xentek
sumber
1
bekerja dengan baik di Rails 3.2.3 menggunakan Ruby 1.9.3 ... "2012-05-16 02:30 UTC" .to_datetime => Rab, 16 Mei 2012 02:30:00 +0000
Tilo
58
Ini juga merupakan metode Ruby on Rails, bukan metode Ruby.
JackCA
5
Ini seharusnya: require 'active_support/all' dan kemudian "30/Nov/2009 16:29:30 +0100".to_datetime (Anda tidak benar-benar membutuhkan semua ekstensi active_support, tapi semoga berhasil mencari tahu mana yang memerlukan secara selektif)
Matt Zukowski
2
ActiveSupport ditata dengan cukup masuk akal, tetapi untuk jumlah dampak paling kecil, ini harus menjadi semua yang Anda butuhkan untuk to_datetimeditambahkan ke Stringobjek:require 'active_support/core_ext/string/conversions'
xentek
3
Pertanyaannya adalah tentang "30 / Nov / 2009: 16: 29: 30 +0100" dan bukan "30 / Nov / 2009 16:29:30 +0100". Itulah alasan lain mengapa itu tidak berhasil.
schmijos
46

Saya telah sukses dengan:

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

Saya menggunakan Time.parse("02/07/1988"), seperti beberapa poster lainnya.

Gotcha yang menarik adalah yang Timedimuat secara default ketika saya membuka IRB, tetapi Time.parsetidak ditentukan. Saya harus require 'time'membuatnya bekerja.

Itu dengan Ruby 2.2.

declan
sumber
12

Ini akan mengubah string dalam tanggal menjadi waktu waktu:

"05/05/2012".to_time
pengguna1425976
sumber
20
Ini adalah metode Ruby on Rails, bukan metode Ruby.
JackCA
1
Meskipun ini bukan jawaban untuk pertanyaan ini, ini sangat membantu saya. Terima kasih @ pengguna1425976
karlingen
10

Untuk developer Chinese Rails:

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

di Ruby 1.8, modul ParseDate akan mengonversi ini dan banyak format tanggal / waktu lainnya. Namun, itu tidak menangani titik dua dengan anggun antara tahun dan jam. Dengan asumsi bahwa titik dua adalah salah ketik dan sebenarnya adalah spasi, maka:

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

Anda juga dapat mengurai string waktu tanggal dengan zona waktu tertentu:

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
sumber