2011-03-06 11 views
7

एक समय स्टाम्प (बस समय या दिनांक और समय) मान लीजिए जहां समय अगले दिन के लिए खत्म हो रोल कर सकते हैं:पार्स बार

00:00:00 < - आधी रात

01:00:00 < - 1 पूर्वाह्न

23:00:00 < - 11 PM पर

24:00:00 < - आधी रात, दिन + 1

25:00:00 < - 1 बजे, दिन + 1

क्या इसे आसानी से पार्स करने के लिए एक तरह से एक सी # समयदिनाँक कि अगले दिन के लिए कैरी-साथ कैसा प्रदर्शन करती हैं में हो सकता है? दूसरे शब्दों में, "01:00:00" "0001-01-01 01:00:00" और "25:00:00" बन जाएगा "0001-01-02 01:00:00"।

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

मैं उल्लेख करना चाहिए कि इस बुरी तरह विफल रहता है (यानी FormatException):

DateTime.ParseExact("0001-01-01 25:00:00", "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture); 
+2

जो लोग इस अंकन के बारे में उत्सुक हो जाएगा के लिए, यह आपरेशन के दिन जा रहा निरूपित करने के लिए पारगमन अधिकारियों द्वारा कभी कभी प्रयोग किया जाता है आधी रात्रि के बाद। – MPelletier

+0

* वास्तविक * स्ट्रिंग आपको पार्स करने के लिए क्या है? यह 0001-01-01 25:00:00 नहीं है मुझे यकीन है। –

+0

@ हंसपैसेंट: नहीं, यह वास्तव में "25:00:00" है। मैंने बस अपने नमूना कोड में तारीख को डाल दिया ताकि इसे वर्तमान तिथि तक डिफ़ॉल्ट न बनाया जा सके। क्षमा करें अगर यह भ्रमित है। – MPelletier

उत्तर

8

चूंकि आप एक विशिष्ट तिथि के बजाए मनमाने ढंग से बिंदु से कुछ समय का प्रतिनिधित्व करने की कोशिश कर रहे हैं, तो शायद आप कक्षा का उपयोग करना बेहतर कर देंगे? यह आपको निर्माता में 24 घंटे से अधिक के मूल्यों को निर्धारित करने की अनुमति देता है, और इस तरह दिनांक समय वस्तुओं के साथ इस्तेमाल किया जा सकता:

System.TimeSpan timestamp = new System.TimeSpan(25, 0, 0); 
System.DateTime parsedDateTime = new DateTime(0, 0, 0); 
parsedDateTime = parsedDateTime.Add(timestamp); 
Console.WriteLine(parsedDateTime.ToString("yyyy-MM-dd HH:mm:ss")); //Output as "0001-01-02 01:00:00" 

नोट: कोड अपरीक्षित है।

संपादित करें: तार पार्स करने के संदर्भ में, मैं किसी भी बुनियादी नेट वस्तुओं है कि एक घंटे के लिए 23 से अधिक मूल्यों के साथ तार को पार्स नहीं सोच सकते हैं (के बाद से 25 दिन की गलत घंटे की है), लेकिन यह मानते हुए कि प्रारूप सुसंगत है, आप व्यक्तिगत रूप से मानों को पढ़ने के लिए एक बहुत ही सरल स्ट्रिंग पार्सिंग दिनचर्या (या यहां तक ​​कि एक नियमित अभिव्यक्ति) बना सकते हैं, और मैन्युअल रूप से कन्स्ट्रक्टर लोड कर सकते हैं।

+1

+1 टाइमस्पेन - इसके बारे में भी सोचा नहीं था। –

+0

आप एक अच्छा मुद्दा बनाते हैं, यह वास्तव में मनमाने ढंग से बिंदु (मध्यरात्रि कहता है, लेकिन किसी भी दिन) से समय है, इसलिए टाइमस्पैन वास्तव में उपयुक्त है। – MPelletier

1

आपने अमान्य तिथि नहीं निर्धारित कर रहे हैं। तो न केवल आप इसे पार्स नहीं कर सकते हैं, आप इसे स्टोर नहीं कर सकते!

इसके बजाय एक अच्छा टाइमस्पैन ऑब्जेक्ट के बारे में कैसे? (इसमें Parse() विधि भी है।)

वैकल्पिक रूप से, sscanf() का उपयोग करें - http://www.blackbeltcoder.com/Articles/strings/a-sscanf-replacement-for-net पर प्रत्येक प्रकार को अलग करने के लिए टाइप करें। (सबसे अच्छा अगर आपके पास स्ट्रिंग प्रारूप को पढ़ने पर कोई नियंत्रण नहीं है।)

+0

टाइमस्पेन। पर्स विधि "25:00:00" पार्सिंग पर ओवरफ्लो एक्सेप्शन फेंकता है। – MPelletier

+0

@MPelletier: कृपया मेरे उत्तर में जो लिंक जोड़ा गया है उसे देखें। यदि प्रारूप गैर मानक है और आप इसे बदल नहीं सकते हैं, तो आपको अलग-अलग मान निकालने की आवश्यकता होगी। –

1

यदि कोई भी आउट ऑफ़ द बॉक्स जवाब नहीं देता है, तो यहां एक साफ एक्शनस्क्रिप्ट क्लास है जिसे मैंने पार्स टाइम इनपुट (मानव इनपुट) ...

https://github.com/appcove/AppStruct/blob/master/Flex/AppStruct/src/AppStruct/TimeInput.as

यह सी # करने के लिए पोर्ट यह करने के लिए बहुत आसान होगा, और आप #days, #hours, #minutes में परिणाम की 24 घंटे तर्क tweak सकता है।

शुभकामनाएं!

2

आप आप को जोड़ सकते हैं एक मौजूदा दिनांक समय मूल्य है, तो आप हमेशा एक TimeSpan उपयोग कर सकते हैं: (! पर्याप्त निष्पक्ष)

string dt = "25:00:00"; 
int hours = int.Parse(dt.Split(':')[0]); 
TimeSpan ts = TimeSpan.FromHours(hours); 

TimeSpan.Parse() सीधे इस मामले में काम नहीं करता है, क्योंकि यह शिकायत के बारे में 25 घंटे के नोटेशन में।

1

आप इसे बाहर कोड करने के लिए चाहते हैं ... यह एक प्रारंभिक बिंदु होना चाहिए:

string dateString = "0001-01-01 25:00:00"; 
string[] parts = dateString.Split(' '); //now have '0001-01-01' and '25:00:00' 

string datePart = parts[0]; // '0001-01-01' 
string[] timeParts = parts[1].Split(':'); //now have '25', '00', and '00 

DateTime initialDate = DateTime.ParseExact(datePart, "yyyy-MM-dd", CultureInfo.InvariantCulture);//use the date as a starting point 

//use the add methods to get your desired datetime 
int hours = int.Parse(timeParts[0]); 
int minutes = int.Parse(timeParts[1]); 
int seconds = int.Parse(timeParts[2]); 

DateTime resultDate = initialDate.AddHours(hours) 
            .AddMinutes(minutes) 
            .AddSeconds(seconds); 
बेशक

, यह मान्यताओं कि इनपुट ठीक से प्रारूपित है बनाता है और parsable है, आदि .. इसके अलावा , आप निश्चित रूप से .. व्यक्ति के बजाय समयावधि इस्तेमाल कर सकते हैं घंटा, मिनट के लिए तरीकों जोड़ने के लिए, दूसरा रूप में कुछ अन्य उत्तर दिए गए हैं

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