2011-09-30 10 views
7

जब मैं डेटटाइम का उपयोग करता हूं तो मुझे अप्रत्याशित परिणाम मिलते हैं। ParseExact।डेटटाइम का उपयोग करना। पैरासेक्स केवल समय प्राप्त करने के लिए (दिन के बिना)

Dim MinVal As DateTime = #12:00:01 AM# 
Dim MaxVal As DateTime = #11:59:59 PM# 
Dim TooBig1, Equal1 As Boolean 
Dim TooBig2, Equal2 As Boolean 

Dim dt1 As DateTime = #12:00:01 AM# 
Dim dt2 As DateTime = DateTime.ParseExact("12:00:01 AM", "hh:mm:ss tt", Globalization.DateTimeFormatInfo.InvariantInfo) 

TooBig1 = (dt1.CompareTo(MaxVal) > 0) 
Equal1 = (dt1.CompareTo(MinVal) = 0) 

TooBig2 = (dt2.CompareTo(MaxVal) > 0) 
Equal2 = (dt2.CompareTo(MinVal) = 0) 

परिणाम DT1 के लिए ठीक है: यहाँ अपने परीक्षण कोड है

  • यह # 12 के रूप में डिबगर में पता चलता है: (दिन) के बिना 01 पूर्वाह्न #
  • TooBig1 है: 00 झूठी
  • Equal1 सच

है लेकिन परिणाम (गलत?) DT2 के लिए अप्रत्याशित है:

  • यह # 9 के रूप में डिबगर में पता चलता/30/2011 12:00:01 #
  • TooBig2 सच
  • Equal2 झूठी

है ऐसा लगता है कि क्योंकि दिन है जैसे कि यह है व्यवस्थित रूप से ParseExact द्वारा जोड़ा गया है भले ही मैं केवल प्रारूप में समय निर्दिष्ट करता हूं।

मेरा प्रश्न है: मैं डेटटाइम के साथ बस समय कैसे पढ़ सकता हूं। पैरासेक्स?

उत्तर

4

Documentation कहता है:

प्रारूप कोई तिथि तत्व के साथ एक समय को परिभाषित करता है और पार्स आपरेशन सफल होता है, जिसके परिणामस्वरूप दिनांक समय मूल्य DateTime.Now.Date की एक तारीख है।

आप कोई तारीख के साथ एक समय चाहते हैं, आप उपयोग कर सकते हैं:

var parsedDate = DateTime.ParseExact(...); 
var timeOnly = parsedDate - parsedDate.Date; 
+2

, एक 'TimeSpan' वस्तु बन जाता है यही कारण है कि हालांकि, नहीं एक' DateTime'। तथ्य यह है कि आप इस महत्वपूर्ण विवरण पर चमकते हैं कि एक बार फिर से दिखाया गया है कि अवांछित चर का उपयोग एक भयानक अभ्यास है। – Nyerguds

+0

@Nyerguds: आप सही हैं कि परिणाम 'टाइमस्पेन' है। जाहिर है कि ओपी चाहता था, या उसने तुरंत यह पता लगाया कि इससे नया 'डेटटाइम' कैसे बनाया जाए। उस कोड स्निपेट में कोई अवांछित चर नहीं हैं; दोनों दृढ़ता से टाइप किए जाते हैं, क्योंकि संकलक पहली बार 'टाइमटाइम' के रूप में 'टाइमऑनली' का उपयोग करने का प्रयास करते समय काफी स्पष्ट रूप से स्पष्ट कर देगा। क्या आप शायद यह कहने का मतलब रखते थे कि टाइप अनुमान का लाभ लेना एक बुरी चीज है? –

+3

हां, "untyped" के साथ मेरा मतलब था "विशेष रूप से कोड में टाइप नहीं किया गया", जिसका अर्थ वास्तव में टाइप अनुमान है। यह भी इसका एक आदर्श उदाहरण है; यह उस कोड से बिल्कुल दिखाई नहीं दे रहा है कि 'डेटटाइम' शून्य 'डेटटाइम' _not_ 'डेटटाइम' के बराबर है। – Nyerguds

2

उपयोग dt1.TimeOfDay और इस तरह की तुलना के लिए dt2.TimeOfDay ... इस प्रकार समीकरण से बाहर दिन भाग लेने ...

2

आप एक दिन निर्दिष्ट नहीं करते हैं, यह जाहिरा तौर पर आज मान लिया गया है। (यदि आप लिख रहे हैं, तो समय-ट्रैकिंग सॉफ़्टवेयर लिख रहे हैं।)

यदि आप केवल समय का हिस्सा चाहते हैं, तो आप इसे पार्स कर सकते हैं जैसे कि आप पहले से ही कर रहे हैं, और फिर केवल समय-समय पर पकड़ लें भाग:

' Existing code: 
Dim dt2 As DateTime = DateTime.ParseExact("12:00:01 AM", "hh:mm:ss tt", _ 
    Globalization.DateTimeFormatInfo.InvariantInfo) 
' Now grab just the time: 
Dim ts2 As TimeSpan = dt2.TimeOfDay 

एक DateTime के बजाय एक TimeSpan हो जाएगा यही कारण है, लेकिन यदि आप एक दिनांक समय के रूप में वास्तव में नहीं है जरूरत यह, TimeSpan कुछ है कि बस घंटे/मिनट/सेकंड, लेकिन कुछ दिनों नहीं के लिए अधिक उपयुक्त है ।

(आप पहली जगह टाइमस्पेन.पर्सएक्सएक्ट का उपयोग करने का भी प्रयास कर सकते हैं, लेकिन यह एएम/पीएम को संभालने के लिए नहीं बनाया गया है, और 12:00:01 को 12 घंटे के रूप में पार्स करेगा। तो शायद आप डेटटाइम चाहते हैं। ParseExact .TimeOfDay के बाद)


आप वास्तव में दिनांक समय के रूप में यह प्रतिनिधित्व करने के लिए जरूरत करते हैं -। की, कहते हैं, 1/1/0001 एक तारीख हिस्से के साथ - आप हमेशा उस समय परिवर्तित कर सकते हैं मैन्युअल रूप से डेटटाइम पर वापस:

Dim dt3 As New DateTime(1, 1, 1, ts2.Hours, ts2.Minutes, ts2.Seconds, ts2.Milliseconds) 
संबंधित मुद्दे

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