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.