2011-10-31 7 views
5
[Test] 
public void Sadness() 
{ 
    var dateTime = DateTime.UtcNow; 
    Assert.That(dateTime, Is.EqualTo(DateTime.Parse(dateTime.ToString()))); 
} 

विफल:हमारे सी # डेटटाइम प्रकार में, इस व्यवहार का कारण क्या है?

Expected: 2011-10-31 06:12:44.000 
But was: 2011-10-31 06:12:44.350 

मुझे पता है कि क्या ToString में पर्दे के पीछे क्या हो रहा है() आदि इस व्यवहार का कारण करना चाहते हैं।

जॉन की जवाब देखने के बाद संपादित करें:

[Test] 
public void NewSadness() 
{ 
    var dateTime = DateTime.UtcNow; 
    Assert.That(dateTime, Is.EqualTo(DateTime.Parse(dateTime.ToString("o")))); 
} 

परिणाम:

Expected: 2011-10-31 12:03:04.161 
But was: 2011-10-31 06:33:04.161 

पूंजी और छोटे 'ओ' के साथ भी यही परिणाम। मैं दस्तावेज़ पढ़ रहा हूं, लेकिन अभी भी अस्पष्ट हूं।

+0

'जोड़ना CultureInfo.InvariantCulture' मदद नहीं की: यह उत्पादन' उम्मीद: 2011-10-31 12: 09: 51.928 लेकिन था: 2011-10-31 06: 39: 51.928 ' – Zasz

+0

कुछ पार्सिंग लॉजिक/स्ट्रिंग लॉजिक में समय के लिए 6 घंटे और 30 मिनट जोड़े गए :( – Zasz

उत्तर

6

डिफ़ॉल्ट फॉर्मेट स्पेसिफायर है "जी" - सामान्य उद्देश्य प्रारूप - जिसमें सीमित निष्ठा है। यदि आप ठीक उसी को पुन: पेश करना चाहते हैं, तो राउंडट्रिप विनिर्देशक, "ओ" का उपयोग करें।

string s = dateTime.ToString("O", CultureInfo.InvariantCulture); 
Assert.That(dateTime, Is.EqualTo(DateTime.ParseExact(
     s, "O", CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind))); 
+0

मैंने अपना संपादित किया सवाल, अपने विचार को शामिल करना - और परिणाम डब्ल्यू है अजीब, मैं अभी भी परेशान – Zasz

+1

@Zasz परिणाम अजीब क्यों है? यदि आपके भ्रम में * जोड़ता है * आपके पास "अपेक्षित" और "वास्तविक" आपके परीक्षण में गलत तरीका है ... क्या हम सब यहाँ मतलब है? –

+1

@Zasz 'DateTime.Parse (s, null, dateTimeStyles.RoundtripKind) ' –

9

dateTime.ToString() उत्पादन पर एक नज़र डालें - यह आमतौर पर केवल दूसरे के लिए सटीक होगा, हालांकि यह सांस्कृतिक सेटिंग्स पर निर्भर करता है। ToString() केवल एक परिणाम के एक दूसरे के लिए सटीक देता है, कोई रास्ता नहीं है कि स्ट्रिंग को पार्स करने में अधिक जानकारी दे सकते हैं ...

आप 'ओ' standard format string उपयोग कर सकते हैं एक गोल trippable स्ट्रिंग प्रतिनिधित्व प्रदान करने के लिए है।

2011-10-31T06:28:34.6425574Z 

संपादित करें: उदाहरण के लिए, इस समय यह की तरह कुछ का उत्पादन आप एक ही परिणाम वापस पाने के लिए एक ही विनिर्देशक साथ पार्स करने के लिए की जरूरत है:

string text = dateTime.ToString("o"); 
// Culture is irrelevant when using the "o" specifier 
DateTime parsed = DateTime.ParseExact(text, "o", null, 
             DateTimeStyles.RoundtripKind); 
+0

मैंने अपना जवाब संपादित किया, अगर मैं मदद करता हूं तो मैं भारत में हूं। – Zasz

+1

@Zasz: आपको इसे उस पैरामीटर के साथ * पार्स * को बताना होगा .. –

+1

+1। ज़ाज़, कृपया एमएसडीएन आलेख को पढ़ें, विशेष रूप से "ओ" और "यू" प्रारूपों से जुड़ा हुआ है। विस्तृत स्पष्टीकरण है कि राउंडट्रिप को कैसे प्राप्त किया जाए। –

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