String'i DateTime'a dönüştür


101

Aşağıdaki String öğesini bir DateTime Nesnesine ayrıştırmam gerekiyor:
30/Nov/2009:16:29:30 +0100

Bunu yapmanın kolay bir yolu var mı?

Not: Yukarıdaki dizeyi olduğu gibi dönüştürmek istiyorum. Yıldan sonraki iki nokta üst üste bir yazım hatası değildir. Ayrıca problemi RoR ile değil Ruby ile çözmek istiyorum.

Yanıtlar:


101

DateTime.strptime , formatı belirtmenize ve bir String'i DateTime'a dönüştürmenize olanak tanır.


1
Teşekkürler. Cevapsız, kendi formatımı verebileceğim. İşte çalışan örnek: '% d /% b /% Y:% H:% M:% S'
— SkaveRat

1
@SkaveRat Diziniz saat dilimine uyuyor mu? Ben kullanıyorum%d/%b/%Y:%H:%M:%S %Z
— 04'te knut

4
Kullanılabilir biçim kısaltmalarının listesi için gist.github.com/halloffame/5350249
— Ryan

9
Kullanıcının sorduğu dizge dönüştürme örneğini belirtmek kibar olur, sadece "oraya git" değil (bu arada tonlarca bilgi var). Stackoverflow, harici belgelere bağlantı verdiği için değil, sorulara cevap verdiği için popüler
— Daniel Garmoshka

"Tam eşleme" yapmanın bir yolu var mı? Şu anda davranış "baştan eşleşiyor", dolayısıyla %Yhem 2015(beklendiği gibi) eşleşecek hem de 2016-foo-bargördüğünde durduğu için 2016. Bu davranış, C muadili ile tutarlıdır; ancak, eşleşmenin tam olup olmadığına karar vermemiz için C işlevi , eşleşmenin sonunun konumunu (ör -. "2016" durumundaki ilk ) döndürür ; Ruby'de a döndürür DateTime, bu nedenle daha sonra hala bir şey olup olmadığını anlayamayız.
— Franklin Yu

98

Bunun Rails için de çalışması gerekmez mi?

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

1
Ruby 1.9.3 kullanarak Rails 3.2.3'te güzel çalışıyor ... "2012-05-16 02:30 UTC" .to_datetime => Çar, 16 Mayıs 2012 02:30:00 +0000
— Tilo

59
Bu aynı zamanda bir Ruby on Rails yöntemidir, bir Ruby yöntemi değildir.
— JackCA

5
Bu şöyle olmalıdır: require 'active_support/all' ve sonra "30/Nov/2009 16:29:30 +0100".to_datetime (aslında tüm active_support uzantılarına ihtiyacınız yoktur, ancak hangilerinin seçmeli olarak gerekli olduğunu bulmak için iyi şanslar)
— Matt Zukowski

2
ActiveSupport oldukça mantıklı bir şekilde düzenlenmiştir, ancak en az etki için, nesnelere to_datetimeeklemek için ihtiyacınız olan tek şey bu olmalıdır String:require 'active_support/core_ext/string/conversions'
— xentek

3
Soru "30 / Kas / 2009: 16: 29: 30 +0100" hakkındadır ve "30 / Kas / 2009 16:29:30 +0100" değildir. İşe yaramamasının başka bir nedeni de bu.
— schmijos

46

Şunlarla başarılı oldum:

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

15

Time.parse("02/07/1988")Diğer bazı posterler gibi kullandım .

İlginç bir şey, IRB'yi Timeaçtığımda varsayılan olarak yüklenmiş, ancak Time.parsetanımlanmamıştı. require 'time'Çalışması için almam gerekiyordu .

Bu Ruby 2.2 ile.


12

Çinli Rails geliştiricileri için:

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


5

Ruby 1.8'de, ParseDate modülü bunu ve diğer birçok tarih / saat biçimini dönüştürecektir. Ancak, iki nokta üst üste ile yıl ve saat arasında incelikli bir şekilde ilgilenmez. Kolonun bir yazım hatası olduğunu ve aslında bir boşluk olduğunu varsayarsak, o zaman:

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

Belirli bir saat dilimine sahip bir tarih saat dizesini de ayrıştırabilirsiniz:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.