Ruby에서 DateTime.now를 UTC로 어떻게 변환합니까?


답변:


154

d = DateTime.now.utc

이런!

그것은 Rails에서 작동하는 것처럼 보이지만 바닐라 루비는 아닙니다 (물론 질문이 요구하는 것입니다)

d = Time.now.utc

그러나 작동합니다.

사용해야하는 이유가 DateTime되지는 Time? Time필요한 모든 것을 포함해야합니다.

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

변환을위한 정확한 날짜를 원하기 때문입니다. 즉, GMT +10의 경우 다음 날이 앞당겨 질 수 있습니다 ...
Ash

2
시간은 당신을 위해 잘 할 것입니다. 시간에는 시간뿐만 아니라 날짜 부분도 포함됩니다. Time.now.inspect를 수행하여 살펴보십시오.
DanSingerman 2009

2
이거 정말 달콤 하네. 그렇다면 날짜, 시간 및 DateTime의 차이점은 무엇입니까?
Ash

18
시간은 1970 년 1 월 1 일 00:00 UTC 이후의 초 및 마이크로 초 수로 내부적으로 저장됩니다. 내부적으로 날짜는 천문학적 율리우스 력 일 수로 표시되고 DateTime은 매우 이상합니다 (이것이 Rails
가이를

168
DateTime.now.new_offset(0)

표준 Ruby에서 작동합니다 (즉, ActiveSupport없이).


3
그리고 이것은 실제로 질문에 대한 가장 정답입니다.
Ernest

2
더 많은 찬성표가 있어야합니다. DateTime은 시간과 다릅니다. 나는 정확히 이것을 필요로했다.
d11wtq 2012 년

1
new_offset메소드 인수의 기본값은 0이미입니다. 그래서 DateTime.now.new_offset또한 사용될 수 있습니다.
Cryptor

8

불행히도 DateTime 클래스에는 Time 클래스에서이 작업을 수행 할 수있는 편리한 메서드가 없습니다. 다음과 같이 DateTime 객체를 UTC로 변환 할 수 있습니다.

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

다음을 사용하여 UTC에서 현지 시간으로 다시 전환 할 수 있습니다.

d.new_offset(DateTime.now.offset)

dUTC 시간의 DateTime 객체는 어디에 있습니까 ? 이것을 편리한 방법으로 원한다면 다음과 같이 만들 수 있습니다.

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.nowDateTime.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.