UTC zaman damgasını Ruby'de ISO 8601'e dönüştürme


86

UTC'de bir zaman damgam var

"2010-10-25 23:48:46 UTC"

ISO 8601'e dönüştürmem gerekiyor

"2010-10-29 06: 09Z"

Belgeler cehennem gibi kafa karıştırıcı - bunu yapmanın en kolay yolu nedir?

Yanıtlar:


187

Bizi kandırmaya çalıştığını düşünüyorum.

Sorunuzun giriş tarihi 25 Ekim 2010 iken çıktı 29 Ekim 2010'dur . Güzel oynadı!

Bu nit-toplama iş parçacığına devam edersek: zamanlarınız da tamamen farklıdır ve çıktı süresinden saniyeleri kaçırıyorsunuz.

Şimdi doğru cevap için.

Öncelikle biraz daha basit: Ruby'deki ISO 8601 çıktısı, ISO 8601'in Wikipedia sayfasındaki "Birleşik tarih ve saat" çıktısına benzer .

Bir dizginiz var ve bu yüzden onu Timeyapabileceğiniz bir nesneye dönüştürmeniz gerekecek to_time. O zaman iso8601ISO 8601 sürümünü edinmek için o nesneyi çağırmak yeterlidir :

"2010-10-25 23:48:46 UTC".to_time.iso8601

to_timeİken yöntem Raylar nezaketi iso8601Ruby'nin standart kütüphanenin nezaket olduğunu.


7
Güzel cevap, ama ilk kısmı alamadım (bu mizah mı olmalıydı?)
Mark Thomas

5
Lanet olsun! Sizleri kandırmak için planımı gördünüz. = P Harika yanıt için teşekkürler, neden bunu belgelere yazmadıklarını merak ediyorum!
ming yeow

13
@Mark Thomas: Evet mizah olması gerekiyordu. Asla eşleşmeyecek bir girdi ve çıktı süresi verdi. Tricksie küçük hobbit!
Ryan Bigg

Bu işe yarıyor, ancak sorusu Ruby'de nasıl yapılacağını sormasına rağmen, bunun raylar ortamında olduğunu varsaymadı.
courtimas

1
İlgili, beni 'to_time' ~ Time.now.iso8601 biçimlerine yönlendirdiğiniz için teşekkür ederiz, "2010-10-25T23: 48: 46Z" gibi biçimlerde, "Z" yerine "+00: 00" kullanmak istiyorsanız ( Eski bir sistem için) Time.now.to_time.iso8601 bunu yapıyor gibi görünüyor.
lucygenik

21

Çok fazla deney yaptıktan sonra, nedenler şu anda benden kaçsa da, Zaman kitaplığının ayrıştırıcısının DateTime'dan daha iyi olduğunu buldum. Bu uyarı ile, bu tür şeyler için her zaman DateTime yerine Time kullanıyorum ve ruby ​​dokümantasyonunun da bunun neden böyle olduğunu anlamak zordur.

require 'time'
puts Time.parse("2010-10-25 23:48:46 UTC").iso8601
"2010-10-25T23:48:46Z"

5
iyi saf yakut çözeltisi. Orijinal zaman UTC değilse şunu eklemek istiyorum: Time.parse("...").utc.iso8601aksi takdirde +03:00, orijinal zaman dizesinin verildiği zaman dilimine bağlı olarak son ekli zamanı veya başka bir değeri alırsınız . Yani yerine Z.
akostadinov

4

Not: to_time yöntemini uygulamadan önce bir zaman dizesini zaman nesnesine dönüştürmeniz (ayrıştırmanız) gerekir.

ruby-1.9.2-p180 :016 > "2010-10-25 23:48:46 UTC".to_time.iso8601
NoMethodError: undefined method `to_time' for "2010-10-25 23:48:46 UTC":String
    from (irb):16

Doğru prosedür:

irb> ut = DateTime.parse("2010-10-25 23:48:46 UTC")

irb> ut.iso8601
 => "2010-10-25T23:48:46+00:00" 

1

Bu çok eski soruya bir cevap eklemek, çünkü Rails kullanıyorsanız, buradaki diğer cevapların size söylediği şekilde onu dönüştürmenize / ayrıştırmanıza gerek yoktur:

  • Zaten bir zaman damgasıysa (örn., A created_atveya updated_atöznitelik), yöntemi o zaman damgasında doğrudan çağırabilirsiniz iso8601(örn object.created_at.iso8601.
  • iso8601Yöntem ayrıca, fraksiyonel basamak görüntülemek için sayısal bir bağımsız değişken kabul; İsterseniz bu kullanmak istiyorsunuz 2020-04-06T19:16:55.604Zyerine 2020-04-06T19:16:55Z.

https://api.rubyonrails.org/v5.2.4/classes/ActiveSupport/TimeWithZone.html#method-i-iso8601

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.