2011-10-17 30 views
9

Vui lòng giải thích cho tôi nếu vấn đề này là một vấn đề noob:Làm cách nào để lưu múi giờ chính xác với Ruby và MongoId?

Tôi có một ứng dụng nơi người dùng có thể đặt Timezones của riêng họ trong tiểu sử của họ.

Khi ai đó thêm một Đội hình (ứng dụng cụ thể thuật ngữ), tôi thực hiện như sau:

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 

sau đó tôi lưu Đội hình:

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

này nên (về mặt lý thuyết) tiết kiệm ngày như gmtime, nhưng tôi nhận được thông tin sau khi xem bản ghi:

{ 
    "_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" 
} 

Như bạn có thể thấy trường ngày tháng là wr ong - nó vẫn duy trì múi giờ của người dùng, nó phải là GMT, không phải múi giờ cụ thể.

Nếu tôi ra time.gmtime, tôi nhận được thời điểm thích hợp (mà nên được lưu):

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

Bất kỳ ý tưởng làm thế nào để tiết kiệm thời giờ để nó thực sự tiết kiệm thời giờ?

Trả lời

11

Có vẻ như bạn cần chỉ định loại trường thuộc tính ngày của bạn. Tôi sẽ sử dụng một lĩnh vực thời gian nếu bạn muốn mongoid để xử lý các khu vực đúng cách.

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

Bạn cũng có thể sẽ muốn thiết lập sau đây trong config/mongoid.yml

defaults: &defaults 
    use_utc: false 
    use_activesupport_time_zone: true 

này nghe có vẻ phản trực giác, nhưng đây là cách hiện tại để làm UTC sử dụng mongoid như múi giờ mặc định.

Cuối cùng, hãy xem đá quý mongoid-metastamp. Nó sẽ cung cấp cho bạn hỗ trợ tốt hơn nhiều cho truy vấn trên nhiều múi giờ, trong khi vẫn hoạt động liền mạch như một trường Thời gian gốc.

+1

Điều này cũng hoạt động với DateTime trong các phiên bản hiện tại của Mongoid (Tôi đang ở trên 2.4.7). Xem https://github.com/mongoid/mongoid/issues/1135 –

Các vấn đề liên quan