Rails 3에서 UTC를 현지 시간으로 변환


95

Rails 3에서 UTC Time또는 TimeWithZone현지 시간으로 변환하는 데 문제가 있습니다.

UTC의 moment일부 Time변수 (예 :) 가 있습니다 moment = Time.now.utc. momentDST (예 : EST / EDT 사용)를 처리하면서 내 시간대 로 어떻게 변환 합니까?

보다 정확하게는 시간이 오늘 아침 오전 9시 EDT에 해당하는 경우 "3 월 14 일 월요일 오전 9시"를 인쇄하고 시간이 지난 월요일 오전 9시 EST 인 경우 "3 월 7 일 월요일 오전 9시"를 인쇄하고 싶습니다.

바라건대 다른 방법이 있습니까?

편집 : 처음 에는 "EDT"가 인식 된 시간대 여야한다고 생각 했지만 "EDT"는 실제 시간대가 아니라 시간대의 상태와 비슷합니다. 예를 들어을 요청하는 것은 의미가 없습니다 Time.utc(2011,1,1).in_time_zone("EDT"). "EST" 일광 절약 시간을 사용하지 않고 1 년 동안 (UTC-5) 사용되는 실제 시간대이므로 약간 혼란 스럽습니다 .

답변:


113

Rails에는 자체 이름이 있습니다. 다음과 같이 참조하십시오.

rake time:zones:us

rake time:zones:all모든 시간대에 대해 실행할 수도 있습니다. 더 많은 영역 관련 레이크 작업을 보려면 :rake -D time

따라서 EST로 변환하려면 DST를 자동으로 충족해야합니다.

Time.now.in_time_zone("Eastern Time (US & Canada)")

21
웹 앱에 액세스하는 사용자의 시간대를 어떻게 자동으로 사용할 수 있습니까?
dmonopoly

내가 찾은 유일한 방법은 Javascript를 사용한 다음 서버로 다시 전달하는 것입니다. (new Date()).getTimeZoneOffset(). 하지만 상당히 일관성이 없어서이
Duke

2
모든 ActiveRecord datetimes에 시간대 자동 추가
-config.time_zone

업데이트 : 연결된 JS 솔루션의 소유자가 새로운 솔루션을 가리 킵니다. pellepim.bitbucket.org/jstz
Miles

@dmonopoly 응용 프로그램 구성에서 시간대를 설정 config.time_zone = 'Wellington'한 다음 Time.current를 사용할 수 있습니다 (time.now와 동일하지만 설정 한 시간대를 사용함)
Sean

116

Time#localtime 코드를 실행하는 머신의 현재 시간대의 시간을 제공합니다.

> moment = Time.now.utc
  => 2011-03-14 15:15:58 UTC 
> moment.localtime
  => 2011-03-14 08:15:58 -0700 

업데이트 : 자신의 시간대가 아닌 특정 시간대로 수렴하고 싶다면 올바른 길을 가고있는 것입니다. 그러나 EST와 EDT에 대해 걱정하는 대신 일반적인 동부 표준시를 통과하면됩니다. 날짜를 기준으로 EDT인지 EST인지 알 수 있습니다.

> Time.now.utc.in_time_zone("Eastern Time (US & Canada)")
  => Mon, 14 Mar 2011 11:21:05 EDT -04:00 
> (Time.now.utc + 10.months).in_time_zone("Eastern Time (US & Canada)")
  => Sat, 14 Jan 2012 10:21:18 EST -05:00 

그것은 시작입니다. 현재 시간대를 설정하려면 어떻게해야하나요 (앱이 호스팅 될 위치가 확실하지 않기 때문에 서버가 사용해야하는 시간대와 다른 시간대에있을 수 있음).
Marc-André Lafortune 2011 년

6
"localtime"방법은 멋지지만 코드를 실행하는 시스템의 시간대는 웹 앱에 액세스하는 사용자의 시간대만큼 유용하지 않습니다. (여기에 언급 된대로 : stackoverflow.com/questions/6003491/rails-3-user-timezones/… ) 웹 앱에 액세스하는 사용자의 시간대를 어떻게 얻을 수 있습니까?
dmonopoly

@daze 사용자가 시간대를 선택할 수있는 옵션을 설정 한 다음 in_time_zone해당 시간대와 함께 방법 을 사용할 수 있다고 생각합니다.
Dylan Markow

1
고마워요, 현지 시간 방법이 정확히 필요한 것입니다.

Time.now.localtime정상적인 irb 세션에서 작동하지만 UTC 시간대에있는 시스템에서 실행하려고하면 작동하지 않습니다.
Ava

15

시스템 로컬 영역을 사용하여 쉽게 구성 할 수 있습니다. 그냥 application.rb에 추가하십시오.

config.time_zone = Time.now.zone

그런 다음 레일은 현지 시간으로 타임 스탬프를 표시하거나이 지침과 같은 것을 사용하여 현지 시간을 가져올 수 있습니다.

Post.created_at.localtime

15

실제로라는 멋진 보석이 있습니다. local_time 클라이언트 측에서만 모든 작업을 수행하도록 basecamp에서 한 .

https://github.com/basecamp/local_time


이것은 가장 잘 작동합니다. 우리는 이미 저장된 시간을 알고 있으며 사용자에게 형식으로 표시하는 방법은 제 생각에 클라이언트 측에서 가장 잘 수행되며 이것이 수행합니다.
Neeraj Shukla

1

이유를 모르지만 제 경우에는 이전에 제안한 방식으로 작동하지 않습니다. 그러나 다음과 같이 작동합니다.

Time.now.change(offset: "-3000")

물론 offset가치를 자신의 것으로 바꿔야 합니다.


0

사용자의 시간대를 얻기 위해 실제로 수행하는 경우에는 시간대를 변경하기 만하면됩니다 config/applications.rb.

이렇게 :

Rails는 기본적으로 현재 시간대를 지정하더라도 UTC로 시간 기록을 저장합니다.

config.time_zone = "Singapore"

그래서 이것이 당신이해야 할 전부이고 당신은 갈 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.