Rubyの標準ライブラリでタイムゾーン関数を使用するにはどうすればよいですか?
概要
Ruby のドキュメントには、タイムゾーンを Time イニシャライザに渡すことができると記載されています。
zone = timezone("Europe/Athens") # Eastern European Time, UTC+2
Time.new(2002, 10, 31, 2, 2, 2, zone) #=> 2002-10-31 02:02:02 +0200
ただし、timezone を呼び出そうとすると、未定義のメソッド「timezone」が表示されます。何か特別な要件はありますか?
解決策
あなたが言及しているタイムゾーン方法は、実際には単なる例です。 Rubyには存在しません。私も同意しますが、この表現と例はおそらく少し誤解を招きます。
Ruby stdlib は、タイムゾーンの UTC オフセットまたは名前を渡すことにより、タイムゾーンを文字列として渡します。これは最初の例に示されています。
文字列「+02:00」に注目してください。
次に、あなたが言及している「犯罪者」の例は次のとおりです。
この例は、どこかにイニシャライザに提供できる TZ を表すオブジェクトを返すコード (ここでは仮想メソッド timezone) があるかのように読めます。
実際の例は、広く採用されている tzinfo ライブラリを使用した次の例です。
[2] pry(main)> require 'tzinfo'
=> true
[3] pry(main)> tz = TZInfo::Timezone.get('America/New_York')
=> #<TZInfo::DataTimezone: America/New_York>
[4] pry(main)> Time.new(2002, 10, 31, 2, 2, 2, tz)
=> 2002-10-31 02:02:02 -0500
[5] pry(main)> Time.new(2002, 10, 31, 2, 2, 2)
=> 2002-10-31 02:02:02 +0100
上記の例では、仮想メソッド timezone が tzinfo から新しい TZ オブジェクトを初期化する実際のコードにどのように置き換えられるかに注目してください。
最後に、Time オブジェクトでzoneを呼び出すことにより、タイムゾーン設定にアクセスできます。取得される内容は、ゾーンの初期化に使用したオブジェクトによって異なることに注意してください。デフォルトでは文字列ですが、以下の例のように tzinfo を使用すると、tzinfo インスタンスが取得されます。
[6] pry(main)> Time.new(2002, 10, 31, 2, 2, 2, tz).zone
=> #<TZInfo::DataTimezone: America/New_York>
[7] pry(main)> Time.new.zone
=> "CET"
要約すると、タイムゾーン メソッドは定義されていません (実際、ドキュメントで示されている方法では、カーネルで定義する必要がありますが、Ruby ではさらに奇妙です)。これは単なるプレースホルダーの例でした。