2011-10-21 26 views
8

Giả sử rằng tôi muốn truy vấn mongo trên dateTime. Tôi có hai biến C# đại diện cho ngày bắt đầu và ngày kết thúc.IsoDate và DateTime trong MongoDB sử dụng C#

1) {2011/10/20 00:00:00}

2) {2011/10/22 00:00:00}

Bây giờ BsonDateTime.Create (datetime) chuyển chúng vào một BSON DateTime tốt quá:

1) 2011-10-20T00: 00: 00 MongoDB.Bson.BsonDateTime

2) 2011-10-22T00: 00: 00 MongoDB.Bson.BsonDateTime

Đây là mã tạo dateTi mes (_value là một chuỗi):

DateTime dateTime; 
bool parsed = DateTime.TryParse(_value, out dateTime); 
if (!parsed) 
    throw new FormatException("Wrong format for a query param"); 
return BsonDateTime.Create(dateTime); 

Sau đó, các mã tiếp theo xây dựng các truy vấn:

private QueryComplete MakeQuery(string key, BsonValue value) 
{ 
    if (_separatorType == ">=") 
     return Query.GTE(key, value); 
    if (_separatorType == "<=") 
     return Query.LTE(key, value); 
    return Query.EQ(key, value); 
} 

Và tôi làm được một giá trị kỳ lạ như vậy trong một truy vấn:

"Sessions.End" : { "$gte" : ISODate("2011-10-19T21:00:00Z"), "$lte" : ISODate("2011-10-21T21:00:00Z") }, 

Vâng , Tôi google ISODate nhưng không tìm thấy bất kỳ lý do gì tại sao nó phải được thay đổi. Là nó ổn?

+1

Bạn nói rằng bạn có hai C# biến, nhưng bạn đã không được hiển thị như thế nào họ đang khởi tạo hoặc thậm chí những gì hãy nhập chúng. Tôi mạnh mẽ nghi ngờ rằng đó là trái tim của sự vật, nhưng chúng tôi không thể nói mà không nhìn thấy mã. Tôi đoán là bạn đã tạo ra * local * giá trị DateTime thay vì các giá trị UTC. –

+0

@Jon Skeet, đã thêm mã để tạo ngày giờ, UTC là gì? –

+0

Xem câu trả lời của tôi - theo liên kết để biết mô tả về UTC. Về cơ bản đây là một vấn đề múi giờ, tôi nghi ngờ ... –

Trả lời

12

Tôi tin rằng vấn đề là DateTime.TryParse được tạo cho bạn một DateTime với một Kind của Local ... trong khi ngày ISO luôn ở UTC. Tôi hy vọng rằng một số phần của mã MongoDB đang chuyển đổi địa phương DateTime thành một trong UTC. Phần lớn là không phải lỗi của bạn - về cơ bản, DateTime is a very confusing type.

Tôi nghi ngờ nếu bạn chỉ định DateTimeStyles.AssumeUniversal trong mã phân tích cú pháp, nó sẽ làm những gì bạn mong đợi.

(Shameless plug: Dự án của riêng tôi, Noda Time, làm cho tất cả những điều này đơn giản hơn rất nhiều ...)

+0

Cảm ơn bạn rất nhiều Jon, nó đã giúp đỡ và điều phổ quát này là thực sự khó hiểu, tôi muốn có được một nắm tốt hơn của datetimes –

+1

mongodb luôn luôn lưu trữ datatime như UTC, và trình điều khiển mongodb C# chuyển đổi thành utc khi lưu giá trị và trở lại địa phương khi đọc giá trị từ db. –

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