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.

Jawaban:


99

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


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

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)

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.


12

Ini akan mengubah string dalam tanggal menjadi waktu waktu:

"05/05/2012".to_time

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

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.