web-dev-qa-db-ja.com

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

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

「2010-10-25 23:48:46 UTC」

ISO 8601に変換する必要があります

「2010-10-29 06:09Z」

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

80
ming yeow

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

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

この短い選択スレッドを続けます。時間も完全に異なり、出力時間から秒が抜けています。

本当の答えになりました。

ただし、最初に少しファクトイド:RubyのISO 8601出力は ISO 8601のWikipediaページ からの「日付と時刻の組み合わせ」出力に似ています。

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

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

to_timeメソッドはRailsの好意によるものであり、iso8601メソッドはRubyの標準ライブラリの好意によるものです。

172
Ryan Bigg

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

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

注: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" 
3
Aerodame