2015-05-22 4 views
6

विफल रहा है मैं एक मोंगोडीबी डेटाबेस के साथ काम कर रहा हूं। मुझे पता है कि जब आप मोंगो में डेटटाइम डालते हैं, तो यह इसे यूटीसी में बदल देता है। लेकिन मैं एक यूनिट परीक्षण कर रहा हूं, और मेरा दावा विफल रहा है।डेटटाइम ToLocalTime

[TestMethod] 
public void MongoDateConversion() { 
    DateTime beforeInsert = DateTime.Now; 
    DateTime afterInsert; 

    Car entity = new Car { 
     Name = "Putt putt", 
     LastTimestamp = beforeInsert 
    }; 

    // insert 'entity' 
    // update 'entity' from the database 

    afterInsert = entity.LastTimestamp.ToLocalTime(); 

    Assert.AreEqual(beforeInsert, afterInsert); // fails here 
} 

मुझे कुछ स्पष्ट याद आना चाहिए। जब मैं डीबगर में लग रहे हैं, मुझे लगता है कि दिनांक के मैच देख सकते हैं, लेकिन ज़ोर अभी भी कहते हैं वे नहीं है (लेकिन वे करते हैं):

Result Message: Assert.AreEqual failed. Expected:<5/21/2015 8:27:04 PM>. Actual:<5/21/2015 8:27:04 PM>. 

कोई भी विचार क्या मैं गलत यहाँ कर रहा हूँ?

संपादित करें:

:

मैं दो संभव समाधान, जो दोनों के लिए मुझे कुछ करने के लिए याद करने के लिए आवश्यकता होती है (जो हमेशा पर भरोसा करने की सबसे अच्छी बात नहीं है ...) लेकर आए हैं

एक किसी भी दिनांक समय डेटाबेस से बाहर आने को काटना एक विस्तार विधि का उपयोग करने के लिए है: http://alexmg.com/datetime-precision-with-mongodb-and-the-c-driver/ पढ़ने के बाद,

public static DateTime Truncate(this DateTime dateTime) { 
    var timeSpan = TimeSpan.FromMilliseconds(1); 
    var ticks = -(dateTime.Ticks % timeSpan.Ticks); 
    return dateTime.AddTicks(ticks); 
} 

अन्य, POCO वर्ग में किसी भी दिनांक समय टैग करने के लिए है:

public class Car : IEntity { 
    public Guid Id { get; set; } 

    [BsonDateTimeOptions(Representation = BsonType.Document)] 
    public DateTime LastTimestamp { get; set; } 
} 
+0

इस लेख MongoDB datetime परिशुद्धता समझा देखें।com/datetime-precision-with-mongodb-and-the-c-driver/ –

उत्तर

1

मोंगोडीबी स्टोरिक्स टाइम्स यूनिक्स युग के बाद मिलीसेकंड की 64-बिट गिनती के रूप में डेटटाइम्स को स्टोर करता है। यह पृष्ठ देखें: http://alexmg.com/datetime-precision-with-mongodb-and-the-c-driver/

चूंकि .NET के दिनांक समय के संकल्प 100 नैनोसेकंड हैं, इसलिए मोंगोडीबी किसी भी डेटटाइम समय को इस तरह से यात्रा करने के लिए लगभग निश्चित है।

आपके पास कुछ विकल्प हैं।

विकल्प 1:

long excessTicks = timestamp.Ticks % 10000; 

timestamp= new DateTime(
    ticks: timestamp.Ticks - excessTicks, 
    kind: timestamp.Kind 
); 

यह दृष्टिकोण त्रुटि प्रवण होने जा रहा है: सुनिश्चित करें कि आप LastTimestamp काटना जब आप इसे सेट करें, या इससे पहले कि आप रिकॉर्ड सम्मिलित करें। कोई भी जो LastTimestamp को सेट करता है उसे इसे छोटा करना याद रखना होगा, या आप रिकॉर्ड डालने से पहले मूल्य को कम कर सकते हैं, लेकिन आपको अप्रत्याशित रूप से सीएलआर ऑब्जेक्ट को बदलने की आवश्यकता हो सकती है।

वैकल्पिक रूप से, आप एक गेटर/सेटर का उपयोग कर सकते हैं और हर बार सेट होने पर मिलीटाइंड्स पर LastTimestamp को छोटा कर सकते हैं। लेकिन इससे कुछ अन्य यूनिट परीक्षण हो सकते हैं, इस परीक्षण में असफल होने के ठीक उसी कारण से लाइन विफल हो रही है।

विकल्प 2: तो उप-मिलीसेकंड सटीकता महत्वपूर्ण नहीं है, बस अपने दावे में कुछ सहिष्णुता डाल: http: // alexmg

TimeSpan delta = beforeInsert - afterInsert; 

Assert.IsTrue(Math.Abs(delta.TotalMilliseconds) <= 2); 
+0

'Math.Abs' के बजाय आप' Assert.IsTrue (डेल्टा.डिशन()। टोटलमिलीसेकंड <= 2) का भी उपयोग कर सकते हैं; '[' अवधि() '] (https://msdn.microsoft.com/en -us/लाइब्रेरी/system.timespan.duration (v = vs.110) .aspx) फ़ंक्शन टाइमपैन का पूर्ण मान देता है। –

1

मुझे लगता है कि आप मिलीसेकंड में अंतर रखते हैं। निम्नलिखित की तरह मिलीसेकंड छोटा प्रयास करें:

DateTime d = DateTime.Now; 
d = d.AddMilliseconds(-d.Millisecond); 
+0

यह काम नहीं करेगा। डेटटाइम। मिलिसेकंड एक पूर्णांक है। यह आपको डेटटाइम मान का केवल मिलीसेकंड हिस्सा देता है। यह हमेशा [99 एमएनएन प्रविष्टि] (https://msdn.microsoft.com/en-us/library/system.datetime.millisecond.aspx) प्रति 0 से 999 तक है। – Daryl

1

आपका परीक्षण गलत (या असंगत) है, क्योंकि वहाँ हमेशा से पहले और डालने के बाद कुछ मिलीसेकेंड अंतर हो जाएगा। आप डेटाटाइम को dd/mm/yy hh:mm:ss के रूप में स्वरूपित स्ट्रिंग में परिवर्तित कर सकते हैं और

संबंधित मुद्दे