2011-10-17 2 views
9

약간의 멍청한 문제인 경우 실례합니다.Ruby와 MongoId를 사용하여 시간대를 올바르게 저장하는 방법은 무엇입니까?

사용자가 자신의 프로필에 자신의 시간대를 설정할 수있는 앱이 있습니다.

사람이, 나는 다음과 같은 않는 라인업 (응용 프로그램 특정 용어) 추가

:이 (이론적으로)로 날짜를 저장해야

Lineup.create({ 
    :date => time.gmtime, 
    :uid => user._id, 
    :pid => product._id 
}) 

:

time = ActiveSupport::TimeZone.new(user.timezone).parse(
    "Wednesday, 26 October, 2011 13:30:00" 
) 

# This outputs: 2011-10-26 13:30:00 +0200 - valid according to the user selected TZ 

내가 다음 라인업을 저장을 gmtime, 그러나 나는 기록을 볼 때 다음을 얻는다 :

{ 
    "_id": ObjectId("4e9c6613e673454f93000002"), 
    "date": "Wed, 26 Oct 2011 13: 30: 00 +0200", 
    "uid": "4e9b81f6e673454c8a000001", 
    "pid": "4e9c6613e673454f93000001", 
    "created_at": "Mon, 17 Oct 2011 19: 29: 55 +0200" 
} 

당신이 볼 수 있듯이 wr ong - 여전히 사용자 시간대를 유지해야합니다. GMT 여야하며 시간대와 관련이 없습니다.

는 I 출력 time.gmtime 경우에, 나는 (즉이 저장 될) 정확한 시간을 얻을 :

2011-10-26 11:30:00 UTC (correct) 

모든 아이디어를 어떻게 실제로 GMT 날짜를 절약 할 수 있도록 GMT 날짜를 저장하는 방법?

답변

11

날짜 속성의 필드 유형을 지정해야하는 것처럼 보입니다. mongoid가 영역을 올바르게 처리하도록하려면 Time 필드를 사용합니다.

class Lineup 
    include Mongoid::Document 
    field :date, type: Time 
end 

당신도 아마 설정/mongoid.yml

defaults: &defaults 
    use_utc: false 
    use_activesupport_time_zone: true 

이 반 직관적 소리에 다음을 설정하는 것이 좋습니다,하지만이 기본 시간대로 mongoid 사용 UTC을 할 수있는 현재의 방법입니다.

마지막으로 mongoid-metastamp 보석을 살펴보십시오. 기본 Time 필드와 같이 완벽하게 작동하면서 여러 시간대에 대해 쿼리를 훨씬 잘 지원합니다.

+1

이것은 현재 몽고이 버전 (2.4.7 버전)에서도 DateTime과 호환됩니다. https://github.com/mongoid/mongoid/issues/1135를 참조하십시오. –

관련 문제