2013-07-25 4 views
0

질문 1 - 달라스, 텍사스의 공유 호스팅에있는 응용 프로그램이 있습니다. 그래서 데이터베이스/웹 서버가 현재 중부 표준시로 설정되어 있습니다 ... 이것을 변경하면 UTC가 테이블에서 벗어납니다.레일/MySQL : 다른 사용자 시간대

내 응용 프로그램은 사용자에게 날짜 및 시간 데이터를 기록하고 표시하지만 모든 사용자는 다른 시간대를 사용할 수 있습니다.

난 사용자가 시간대를 선택할 수 있도록 다음 내 응용 프로그램 (config.time_zone = 'Central Time (US & Canada)')를 구성하지만, 경우

def user_time_zone(&block) 
    Time.use_zone(current_user.time_zone, &block) 
end 

의 RoR 어떤 사용자의 선택의 시간대에 반환 된 데이터가 표시됩니다? 또는 데이터가 표시되기 전에 데이터를 평가하고 그에 맞게 수정해야합니까?

질문 1.1 - 사용자에게 일일/주간/월간 보고서를 보내는 관련 메일러가 있습니다. CRON을 사용하여 이러한 작업을 실행하면 시간대를 허용하기 위해 다른 시간 간격으로 작업을 예약해야합니까? 즉, 하나의 작업은

when 'daily' 
    @dates = params[:f]['Date Range'] = "#{Date.current} - #{Date.current}" 

Date.current 동쪽 해안에 앞서 1 시간이 될 것입니다 포함하고, 뒤에 3 시간 웨스트 등합니다. 그래서 (여전히 Central의 서버 시간대를 사용하고 있습니다.) 오후 11시 (동쪽)와 오전 2시 (서쪽)에 하나씩 실행합니까?

모든 조언과 도움을 주시면 대단히 감사하겠습니다. 감사!

+0

흥미로운 질문입니다. 호스트의 데이터베이스 서버 란 무엇입니까? – Benj

+0

감사합니다. MySQL을 사용하고 있습니다. – user464180

답변

2

최상의 결과를 얻으려면 응용 프로그램이 실행되는 컴퓨터의 표준 시간대가 데이터 나 동작에 영향을주지 않도록 응용 프로그램을 작성해야합니다.

일반적으로 코드에서 UTC로 작업하는 것을 의미합니다. 예를 들어, Time.now 대신 Time.now.utc과 같이 입력하십시오. RoR에 대한 자세한 내용은 this post을 참조하십시오.

가능한 경우 서버 표준 시간대를 UTC로 설정하는 것이 가장 좋지만 코드에서 해당 표준 시간대를 사용하는 것은 아닙니다.

두 번째 질문에 대해서는 모든 시간대에는 "하루"라는 개념이 있습니다. 시각화에 대해서는 this site을 참조하십시오.

데이터를 정렬 할 각 표준 시간대의 자정에 별도의 작업을 실행해야합니다. StackExchange 웹 사이트와 같은 일부 응용 프로그램에서는 모든 사용자에 대해 단일 표준 시간대 (UTC)를 사용합니다. 다른 응용 프로그램은 자신의 시간대에 따라 각 사용자의 데이터를 조정합니다. 당신은 당신의 어플리케이션에 적합한 것이 무엇인지 결정할 필요가 있습니다.

작업을 예약 할 때 각 시간대의 자정이 정렬되는 UTC 시간을 결정하십시오. 그런 다음 그 시간에 일자리를 예약하십시오. 스케줄러가 UTC인지 이해하십시오. 서버의 현지 표준 시간대로 조정하지 마십시오. 현지 표준 시간대가 일광 절약 시간 전환을 거치면 오류가 발생할 수 있습니다.

예약 된 작업이 올바른 시간에 실행될뿐만 아니라 보고서 쿼리가 실행해야하는 UTC 범위를 결정할 때 올바른 표준 시간대를 사용하는지 확인하십시오.

동일한 데이터를보고하는 두 시간대의 두 사용자가 서로 다른 결과를 산출 할 수 있다는 것을 의미합니다. 이는 각 '일'이 약간 다른 기간이기 때문입니다.

+0

설명해 주셔서 감사합니다. 애플 리케이션에 관해서는, 분명히 알기 때문에, 내 DB에 저장된 데이터는 중부 표준시에 기록됩니다. 따라서 앱 코드에서이 코드를 UTC (호출 될 때)로 변환 한 다음 (+/-)로 조정해야합니다. 필요에 따라 사용자의 시간대? – user464180

+0

데이터를 UTC로 DB에 저장하도록 앱을 변경해야합니다. 현지 시간을 저장하는 문제는 애매 모호 할 수 있다는 것입니다. 예를 들어 '2013-11-03 01 : 00'을 저장하고 이것이 미국 중부 표준시 인 경우 일광 절약 시간 종료로 인해 참조 할 수있는 두 가지 가능한 시간이 있습니다. [참조하십시오] (http://www.timeanddate.com/worldclock/clockchange.html?n=64) –

+0

이미 프로덕션 데이터를 중앙 시간에 저장 한 경우 변경 사항을 롤아웃 할 때 프로덕션 데이터를 변환해야합니다 . 내가 utc 시간에 대한 새로운 컬럼을 추가하고 나중에 이전 하나를 삭제하는 것이 좋습니다 것입니다. 고정 -5 또는 -6 오프셋이 아닌 중앙 시간 ('미국/시카고')으로 변환해야합니다. ['TZInfo :: AmbiguousTime'] (http://tzinfo.rubyforge.org/doc/TZInfo/AmbiguousTime.html)을 사용하여 모호성을 검사하십시오. 이러한 모호성을 어떻게 처리할지 결정해야합니다. 물론 아직 변환 할 프로덕션 데이터가 없다면 훨씬 쉬울 것입니다. –

2

Matt의 매우 명확한 대답.UTC TZ에 시간 데이터를 저장 한 다음 사용자 TZ (또는 게스트 사용자의 경우 TZ 서버)로 변환하려는 경우

UTC가 아닌 TZ로 전체적으로 설정된 MySQL을 사용하는 경우이 설정을 다음의 쿼리

문제 :이 명령은 MySQL에서 세션 전체에 적용되므로 데이터베이스에 대한 새 연결이 초기화 될 때마다 다시 설정해야합니다. Rails ActiveRecord :: ConnectionAdapters :: ConnectionPool 클래스가 도움이 될 것입니다. (그리고 당신은뿐만 아니라 그랬어)

How do I execute queries upon DB connection in Rails?

다음으로 자신의 TZ을 가지고 application.rb에서 서버 기본 TZ를 (당신이 그랬어)을 설정하고 각 사용자를 설정해야합니다 :이 답변을 참조하십시오 마지막으로 시간 데이터에 액세스 할 때마다 Rails 규칙을 따라야합니다. 그 기사에서 http://www.elabs.se/blog/36-working-with-time-zones-in-ruby-on-rails

추출 : 나는 모든 질문에 대답합니다 매우 유용한 정보가 가득, 당신을 위해이 문서를 발견

및 DO

2.hours.ago # => Fri, 02 Mar 2012 20:04:47 JST +09:00 
1.day.from_now # => Fri, 03 Mar 2012 22:04:47 JST +09:00 
Date.today.to_time_in_current_zone # => Fri, 02 Mar 2012 22:04:47 JST +09:00 
Date.current # => Fri, 02 Mar 
Time.zone.parse("2012-03-02 16:05:37") # => Fri, 02 Mar 2012 16:05:37 JST +09:00 
Time.zone.now # => Fri, 02 Mar 2012 22:04:47 JST +09:00 
Time.current # Same thing but shorter. (Thank you Lukas Sarnacki pointing this out.) 
Time.zone.today # If you really can't have a Time or DateTime for some reason 
Time.zone.now.utc.iso8601 # When supliyng an API (you can actually skip .zone here, but I find it better to always use it, than miss it when it's needed) 
Time.strptime(time_string, '%Y-%m-%dT%H:%M:%S%z').in_time_zone(Time.zone) # If you can't use Time#parse 

금지 사항을

Time.now # => Returns system time and ignores your configured time zone. 
Time.parse("2012-03-02 16:05:37") # => Will assume time string given is in the system's time zone. 
Time.strptime(time_string, '%Y-%m-%dT%H:%M:%S%z') # Same problem as with Time#parse. 
Date.today # This could be yesterday or tomorrow depending on the machine's time zone. 
Date.today.to_time # => # Still not the configured time zone. 
+0

+1 루비 특정 정보입니다. 나는 표준 시간대에 대해 많이 알고 있지만 루비에 대해서는 거의 모른다. 감사! –

+0

나의 기쁨 Matt – Benj