RubyでDateTime.nowをUTCに変換するにはどうすればよいですか?


96

私が持っている場合d = DateTime.now、「d」をUTCに(適切な日付で)変換するにはどうすればよいですか?

回答:


154

d = DateTime.now.utc

おっとっと!

それはRailsでは機能しているようですが、Ruby Rubyでは機能しません(そしてもちろんそれが問題です)

d = Time.now.utc

しかし動作します。

あなたが使用する必要が何らかの理由があるDateTimeとないではTimeTime必要なものがすべて含まれている必要があります。

irb(main):016:0> Time.now
=> Thu Apr 16 12:40:44 +0100 2009

変換の正しい日付が必要なため、つまり、GMT +10は翌日より早くなる可能性があります...
Ash

2
時間はあなたのためにうまくやります。時間には、時刻だけでなく日付部分も含まれます。Time.now.inspectで確認してください。
DanSingerman 2009

2
お、可愛い。では、Date、Time、DateTimeの違いは何でしょうか。
Ash

18
時間は、エポック、1970年1月1日00:00 UTCからの秒数とマイクロ秒数として内部的に格納されます。内部的には、日付は天文ユリウス
日数

168
DateTime.now.new_offset(0)

標準のRuby(つまりActiveSupportなし)で動作します。


3
そして、これは実際には質問に対する最も正しい答えです。
アーネスト

2
これはもっと賛成票を持つべきです。DateTimeはTimeとは異なります。私はまさにこれを必要としていました。
d11wtq 2012

1
new_offsetメソッドの引数のデフォルトは0すでにです。したがってDateTime.now.new_offset、同様に使用できます。
Cryptor 2017

8

残念ながら、DateTimeクラスには、Timeクラスでこれを行うための便利なメソッドがありません。次のように、任意のDateTimeオブジェクトをUTCに変換できます。

d = DateTime.now
d.new_offset(Rational(0, 24))

以下を使用して、UTCから現地時間に切り替えることができます。

d.new_offset(DateTime.now.offset)

どこdDateTimeオブジェクトはUTC時刻です。これらを便利なメソッドとして使用したい場合は、次のように作成できます。

class DateTime
  def localtime
    new_offset(DateTime.now.offset)
  end

  def utc
    new_offset(Rational(0, 24))
  end
end

これは、次のirbセッションで実際に確認できます。

d = DateTime.now.new_offset(Rational(-4, 24))
 => #<DateTime: 106105391484260677/43200000000,-1/6,2299161> 
1.8.7 :185 > d.to_s
 => "2012-08-03T15:42:48-04:00" 
1.8.7 :186 > d.localtime.to_s
 => "2012-08-03T12:42:48-07:00" 
1.8.7 :187 > d.utc.to_s
 => "2012-08-03T19:42:48+00:00" 

上記のように、最初のDateTimeオブジェクトには-04:00オフセット(東部時間)があります。私は-07:00のオフセットで太平洋時間にいます。localtime前述のように呼び出すと、DateTimeオブジェクトが現地時間に正しく変換されます。utcオブジェクトを呼び出すと、適切にUTCオフセットに変換されます。


5

これを試して、Rubyで動作します:

DateTime.now.to_time.utc

4

あなたがしたい場合は、ENVを設定することができますTime.nowし、DateTime.nowUTC時間で応答します。

require 'date'
Time.now #=> 2015-11-30 11:37:14 -0800
DateTime.now.to_s #=> "2015-11-30T11:37:25-08:00"
ENV['TZ'] = 'UTC'
Time.now #=> 2015-11-30 19:37:38 +0000
DateTime.now.to_s #=> "2015-11-30T19:37:36+00:00"

2

IRB:

>>d = DateTime.now
=> #<DateTime: 11783702280454271/4800000000,5/12,2299161>
>> "#{d.hour.to_i - d.zone.to_i}:#{d.min}:#{d.sec}"
=> "11:16:41"

時間をutcに変換します。しかし、それがちょうど時間である場合、あなたが使用できるのは投稿されたとおりです:

Time.now.utc

すぐに入手してください。


1

DateTimeの文字列表現は、Timeクラスによって解析できます。

> Time.parse(DateTime.now.to_s).utc
=> 2015-10-06 14:53:51 UTC
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.