26

このTime.iso8601メソッドは、ISO-8601の制限されたサブセットです。

  • その制限は何ですか?
  • Rubyの完全な実装を知っている人はいますか?私はMRI1.8.7を使用しています。

アップデート

さまざまな8601の日付と日付/時刻の組み合わせのすべてを処理する単一のクラスはないようです。Date.parseしかし、私はとTime.iso8601メソッドの両方を使用して問題を回避することができました。欠点は、入力が日付のように見えるか、日付/時刻のように見えるかをコードで決定する必要があることです。

警告:タイムゾーンの違い

Time.iso8601Time.parse動作が異なります。

>> Time.parse("2010-09-06T12:27:00.10-05:00")
=> Mon Sep 06 18:27:00 +0100 2010

>> Time.iso8601("2010-09-06T12:27:00.10-05:00")
=> Mon Sep 06 17:27:00 UTC 2010

Time.iso8601とISO-8601の違い

このドキュメントでは、ISO-8601にあるものとRubyでサポートされているものの違いに触れています。簡単に言えば、可能なフォーマットの数は制限されているということです。

4

2 に答える 2

18

はい、残念ながら Ruby 1.9 です。

require "date"

Date.iso8601("2010-W32-5").strftime
#=> "2010-08-13" 

Ruby 1.8.7 の実装があるとは思えません (少なくとも、私は見つけられませんでした)。1.9.2 の時点でかなり安定している Ruby 1.9 にアップグレードしてみてください。または、自分で日付を解析することもできます。

于 2010-09-03T12:03:20.970 に答える
14

ISO8601 日付をローカル タイム ゾーンに変換するには、次の操作を行います。

require "time"
dt1 = Time.parse("2010-09-06T12:27:00.10-05:00")

ISO8601 日付を UTC に変換するには、次のようにします。

dt2 = Time.iso8601("2010-09-06T12:27:00.10-05:00")

上記のクエリによって返された日付を比較すると、それらは同一になります (つまり、dt1 === dt2)。ただし、日付コンポーネント (年、月、日、時間など) にアクセスすると、タイム ゾーン (UTC またはローカル) に適した値が返されます。同じことが strftime にも当てはまります。

于 2011-09-27T23:08:37.093 に答える