Rails : UTC DateTime을 다른 시간대로 변환


답변:


206
time.in_time_zone(time_zone)

예:

zone = ActiveSupport::TimeZone.new("Central Time (US & Canada)")
Time.now.in_time_zone(zone)

아니면 그냥

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

다음을 수행하여 ActiveSupport 시간대의 이름을 찾을 수 있습니다.

ActiveSupport::TimeZone.all.map(&:name)
# or for just US
ActiveSupport::TimeZone.us_zones.map(&:name)

irb에서 Time.now.in_time_zone ( 'CST')를 시도하면 "undefined method 'in_time_zone'"오류가 발생합니다. 이 작업을 수행하는 데 필요한 레일 클래스가 있습니까?
Drew Johnson

어떤 버전의 Rails를 사용하고 있습니까? Time.zone.now.in_time_zone (...)을 수행하면 작동합니까?
mckeed 2010-04-23

13
이것을 Rails 외부에서 사용하려면 require 'active_support/time'먼저.
sunaku

3
를 실행하여 모든 시간대를 나열 할 수 있습니다 rake time:zones:all. 를 참조하십시오 rake -D time. 에서 기본 시간대를 설정합니다 config/application.rb.
user664833

1
@AdamEberlin Rails에서는 일반적으로 DateTime이 아닌 ActiveSupport :: TimeWithZone을 사용합니다. 이 모든 코드는 루비 DateTime 객체와 Time 객체에서 작동합니다.
mckeed

6

경우 Time.zone가 원하는 시간대의 당신은 사용할 수 있습니다@date.to_time.to_datetime

> @date
=> Tue, 02 Sep 2014 23:59:59 +0000
> @date.class
=> DateTime
> @date.to_time
=> 2014-09-02 12:59:59 -1100
> @date.to_time.to_datetime
=> Tue, 02 Sep 2014 12:59:59 -1100 

Rails 5에서 작동하지 않습니다.`Time.zone # => Europe / Paris my_date # => Wed, 29 Mar 2017 19:00:20 +0200 my_date.to_time # => "2017-03-29T17 : 00 : 20.000+ 0시 "my_date.to_time.to_datetime 번호 => 2017년 3월 29일 (수) 17시 0분 20초 0000`
시릴 Duchon - 도리스

5

일반 루비에서는 만 require 'date'사용하여 다음 new_offset방법을 사용하십시오 .

require 'date'

d=DateTime.parse('2000-01-01 12:00 +0200')
l=d.new_offset('-0700')
u=l.new_offset('UTC')
puts "#{u.strftime('%a %F %T %Z')} ❖ #{l.strftime('%a %F %T %Z')}"

Mac OS X 10.13에서 표준으로 제공되는 루비 2.3.7로 테스트되었습니다.


3

TimeZone으로 조작 된 ActiveSupport의 TimeWithZone 개체를 사용해보십시오 . ActiveSupport는 UTC 시간을 지정된 TimeZone 시간대로 변환하기위한 in_time_zone 메소드도 제공합니다. mckeed의 답변은 코드를 보여줍니다.


TimeWithZone을 내 클래스로 가져 오는 구문은 무엇입니까? 아니면 Rails에서 기본적으로 받습니까?
Drew Johnson

1
나는 당신이 그것을 기본적으로 얻는다고 믿습니다. mckeed에는 필요한 코드가 있지만 irb에서는 볼 수 없습니다. Rails에서 실행해야합니다.
프레드

당신 말이 맞아요-고마워요, Fred-그것은 기본적으로 Rails와 함께 제공됩니다. 나는 빨대를 잡고 irb에서 작동하도록 노력했습니다.
Drew Johnson

3

Rails에서 ActiveRecord 객체를 다루는 경우를 대비하여.

Time.use_zone설정된 기본 시간대를 재정의하는 요청 기준 시간대 를 사용하는 것이 좋습니다 .config.time_zone

자세한 내용은 https://stackoverflow.com/a/25055692/542995 에서 설명합니다.


0

Rails 4에서 simple_form을 사용하고 있으며 입력 필드를 다음과 같이 추가했습니다.

<%= f.input :time_zone, :as => :time_zone %>

마이그레이션과 함께

class AddTimeZoneColumnToTextmessage < ActiveRecord::Migration
  def change
    add_column :textmessages, :time_zone, :string
  end
end

1
이것은 당신이 날짜 시간 객체로 변환하는 방법의 질문에 대답하지 않습니다
zykadelic
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.