UTCのタイムスタンプがあります
「2010-10-2523:48:46UTC」
ISO8601に変換する必要があります
「2010-10-2906:09Z」
ドキュメントは地獄のように混乱しています-それを行う最も簡単な方法は何ですか?
回答:
あなたは私たちをだまそうとしていると思います。
質問への入力日は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の標準ライブラリの好意によるものです。
多くの実験の結果、TimeライブラリのパーサーはDateTimeよりも優れていることがわかりましたが、現時点では理由はわかりません。その警告で、私は常にこの種のものにDateTimeではなくTimeを使用します、そしてこれがなぜそうなのかについてルビーのドキュメントも理解するのが難しいです、
require 'time'
puts Time.parse("2010-10-25 23:48:46 UTC").iso8601
"2010-10-25T23:48:46Z"
Time.parse("...").utc.iso8601
、次のようにすることができます。+03:00
それ以外の場合は、元の時刻文字列が指定されているタイムゾーンに応じて、接尾辞またはその他の値を取得します。つまり、の代わりにZ
。
注: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"
Railsを使用している場合は、他の回答で指示されている方法で変換/解析する必要がないため、この非常に古い質問への回答を追加します。
created_at
またはupdated_at
属性)である場合は、そのタイムスタンプ(例:)でメソッドを直接呼び出すことができます。iso8601
object.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