RubyでUTCタイムスタンプをISO8601に変換する


85

UTCのタイムスタンプがあります

「2010-10-2523:48:46UTC」

ISO8601に変換する必要があります

「2010-10-2906:09Z」

ドキュメントは地獄のように混乱しています-それを行う最も簡単な方法は何ですか?

回答:


185

あなたは私たちをだまそうとしていると思います。

質問への入力日は2010年10月25日で、出力は2010年10月29日です。よくやった!

このちょっとした選択のスレッドを続けます。あなたの時間も完全に異なり、出力時間から秒が欠落しています。

さて、本当の答えです。

ただし、最初は少し事実です。RubyでのISO 8601の出力は、ISO8601のWikipediaページからの「日付と時刻の組み合わせ」の出力に似ています

文字列があるので、それをTimeで実行できるオブジェクトに変換する必要がありますto_time。次にiso8601、そのオブジェクトを呼び出してISO8601バージョンを取得するだけです。

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

このto_time方法はRailsの好意によるものiso8601ですが、Rubyの標準ライブラリの好意によるものです。


7
良い答えですが、最初の部分が
Mark Thomas

5
くそー!あなたは私の計画を見て、人々をだましました。= Pすばらしい答えをありがとう、なぜ彼らはそれをドキュメントに書いていないのだろうか!
ming yeow 2010年

13
@マークトーマス:はい、それはユーモアであるはずでした。彼は、これまでに一致しない入力時間と出力時間を与えました。トリッキー小さなホビット!
ライアンビッグ2010年

これは機能しますが、彼の質問はルビーでそれを行う方法を尋ねましたが、それがレール環境にあるとは想定していませんでした。
courtsimas 2015

1
関連して、「Z」の代わりに「+00:00」を使用したい場合は、「to_time」〜「2010-10-25T23:48:46Z」のようなTime.now.iso8601形式を指定していただきありがとうございます(私が持っていた)レガシーシステムの場合)Time.now.to_time.iso8601がこれを行っているようです。
lucygenik 2015

21

多くの実験の結果、TimeライブラリのパーサーはDateTimeよりも優れていることがわかりましたが、現時点では理由はわかりません。その警告で、私は常にこの種のものにDateTimeではなくTimeを使用します、そしてこれがなぜそうなのかについてルビーのドキュメントも理解するのが難しいです、

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

5
良い純粋なルビーソリューション。追加したいのですが、元の時刻がUTCでない場合はTime.parse("...").utc.iso8601、次のようにすることができます。+03:00それ以外の場合は、元の時刻文字列が指定されているタイムゾーンに応じて、接尾辞またはその他の値を取得します。つまり、の代わりにZ
akostadinov 2016年

4

注:to_timeメソッドを適用する前に、時間文字列を時間オブジェクトに変換(解析)する必要があります。

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

正しい手順:

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

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

1

Railsを使用している場合は、他の回答で指示されている方法で変換/解析する必要がないため、この非常に古い質問への回答を追加します。

  • すでにタイムスタンプ(例:created_atまたはupdated_at属性)である場合は、そのタイムスタンプ(例:)でメソッドを直接呼び出すことができます。iso8601object.created_at.iso8601
  • このiso8601メソッドは、小数桁を表示するための数値引数も受け入れます。必要に応じて、の2020-04-06T19:16:55.604Z代わりにこれを使用します2020-04-06T19:16:55Z

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.