2010-04-28 18 views
22

सी # में टाइमस्पेन को 30:15 जैसे स्ट्रिंग का विश्लेषण कैसे करें? 30:15 का मतलब 30 घंटे और 15 मिनट है।टाइमस्पेन से 24 घंटे से अधिक घंटे के साथ स्ट्रिंग का विश्लेषण कैसे करें?

string span = "30:15"; 
TimeSpan ts = TimeSpan.FromHours(
    Convert.ToDouble(span.Split(':')[0])). 
    Add(TimeSpan.FromMinutes(
    Convert.ToDouble((span.Split(':')[1])))); 

यह बहुत ही सुरुचिपूर्ण प्रतीत नहीं होता है।

+0

यह स्थानीयकरण समर्थन करने की आवश्यकता है? (उदाहरण के लिए 30.15 भाषा सेटिंग्स के अनुसार) –

+0

प्रारूप हमेशा एचएच होगा: मिमी लेकिन हो सकता है> 24. – jlp

+0

यह देखें [प्रश्न] (http://stackoverflow.com/questions/26760/c-parse-string -to-timespan) (डुप्लिकेट)। – Ando

उत्तर

24

आपको विश्वास है कि प्रारूप हमेशा होंगे तो "HH: mm" फिर कुछ इस तरह का प्रयास करें:

string span = "35:15"; 
TimeSpan ts = new TimeSpan(int.Parse(span.Split(':')[0]), // hours 
          int.Parse(span.Split(':')[1]), // minutes 
          0);        // seconds 
+0

बदसूरत, लेकिन मुझे लगता है कि ऐसा करने का तरीका है। धन्यवाद – invalidusername

+2

यह नकारात्मक समय के साथ काम नहीं करता है (-35: 15 परिणामस्वरूप -34: 45) – fubo

+0

अच्छी सी # टाइमस्पैन काम करता है लेकिन आप इस मान को MSSQL में कैसे स्टोर करेंगे? समय (7) काम नहीं करता है और स्ट्रिंग अच्छा नहीं होगा। – MaxW

0

आम तौर पर एक TimeSpan.ParseExact जहां एक विशिष्ट प्रारूप की आवश्यकता है का प्रयोग करेंगे। लेकिन निर्दिष्ट किए जा सकने वाले एकमात्र घंटे प्रारूप दिन के कुछ हिस्सों के रूप में हैं (Custom TimeSpan Format Strings देखें)।

इसलिए आप काम खुद करने की आवश्यकता होगी:

string input = "30:24"; 
var parts = input.Split(':'); 
var hours = Int32.Parse(parts[0]); 
var minutes = Int32.Parse(parts[1]); 
var result = new TimeSpan(hours, minutes, 0); 

(लेकिन साथ कुछ त्रुटि जाँच।)

समयावधि के तीन पूर्णांक निर्माता दिनों गिनती में बह निकला अनुमति देता घंटे> = 24।

4

ल्यूक के जवाब देने के लिए समान:

String span = "123:45"; 
Int32 colon = span.IndexOf(':'); 
TimeSpan timeSpan = new TimeSpan(Int32.Parse(span.Substring(0, colon - 1)), 
           Int32.Parse(span.Substring(colon + 1)), 0); 

जाहिर है यह मान लिया गया है मूल स्ट्रिंग अच्छी तरह से बनाई है (दो भागों एक पूर्णांक संख्या को पेट और parsable द्वारा अलग से बना)।

+0

मुझे ल्यूक के एक हैंडल का मानना ​​है> 99 क्या यह नहीं है? – jlp

+0

@Erik, @jlp: हाँ, मेरा 99 से अधिक घंटे ठीक है, हालांकि मेरा मूल जवाब नहीं था (इससे पहले कि मैंने इसे आधे घंटे पहले संपादित किया था)। शायद एरिक पुराने जवाब को देख रहा था। – LukeH

+0

@ ल्यूक: हाँ!जैसा कि आपने यहां जवाब दिया है;) –

3

मैं एक सरल विधि है कि मैं एक लंबे समय पहले तैयार है और बस अपने ब्लॉग पर आज तैनात उपयोग कर रहा हूँ:

public static class TimeSpanExtensions 
{ 
    static int[] weights = { 60 * 60 * 1000, 60 * 1000, 1000, 1 }; 

    public static TimeSpan ToTimeSpan(this string s) 
    { 
     string[] parts = s.Split('.', ':'); 
     long ms = 0; 
     for (int i = 0; i < parts.Length && i < weights.Length; i++) 
      ms += Convert.ToInt64(parts[i]) * weights[i]; 
     return TimeSpan.FromMilliseconds(ms); 
    } 
} 

इस से पहले दी सरल समाधान तुलना में बहुत अधिक स्थितियों को संभाल सकता है, लेकिन इसकी है अपनी कमियों मैं इसे here पर चर्चा करता हूं।

अब, अगर आप नेट 4 में हैं आप के लिए ToTimeSpan कार्यान्वयन छोटा कर सकते हैं:

public static TimeSpan ToTimeSpan(this string s) 
{ 
    return TimeSpan.FromMilliseconds(s.Split('.', ':') 
     .Zip(weights, (d, w) => Convert.ToInt64(d) * w).Sum()); 
} 

तुम भी यह एक एक लाइनर कर सकते हैं अगर आप क्षैतिज स्क्रीन राज्य का उपयोग कोई आपत्ति नहीं है ..

+0

समस्या ठीक है अगर समस्या वास्तव में प्रश्न में वर्णित है। लेकिन यदि टाइमस्पेन स्ट्रिंग मान "1.06: 00: 00" जैसा है, तो यह समाधान विफल हो जाता है। दुर्भाग्य से लिंक जो कमियों को समझाता है वह काम नहीं कर रहा है। मेबे इस मुद्दे पर चर्चा की गई है। – Florian

+0

@ फ्लोरियन मैं अपने ब्लॉग को एक नए (और बेहतर) होस्ट में ले जा रहा हूं, यही कारण है कि इसके लिए ऑफ़लाइन! यह दिन, केवल घंटों का समर्थन नहीं करता है। इसलिए, यदि आप 24 + 6 घंटे चाहते हैं, तो आपको 30:00:00 का उपयोग करना होगा। विचार पूरी तरह से दिन का उपयोग करने से बचने के लिए था। नकारात्मक मूल्यों का समर्थन न करने के साथ कमियों को और अधिक करना है ... – Loudenvier

1

लुकेस उत्तर के समान, सुधार के लिए बहुत अधिक कोड और कमरा के साथ। लेकिन यह नकारात्मक समय ("-30: 15") के साथ भी व्यवहार करता है, इसलिए शायद यह किसी की मदद कर सकता है।

public static double GetTotalHours(String s) 
    { 
     bool isNegative = false; 
     if (s.StartsWith("-")) 
      isNegative = true; 

     String[] splitted = s.Split(':'); 
     int hours = GetNumbersAsInt(splitted[0]); 
     int minutes = GetNumbersAsInt(splitted[1]); 

     if (isNegative) 
     { 
      hours = hours * (-1); 
      minutes = minutes * (-1); 
     } 
     TimeSpan t = new TimeSpan(hours, minutes, 0); 
     return t.TotalHours; 
    } 

public static int GetNumbersAsInt(String input) 
     { 
      String output = String.Empty; 
      Char[] chars = input.ToCharArray(0, input.Length); 
      for (int i = 0; i < chars.Length; i++) 
      { 
       if (Char.IsNumber(chars[i]) == true) 
        output = output + chars[i]; 
      } 
      return int.Parse(output); 
     } 

उपयोग

double result = GetTotalHours("30:15"); 
double result2 = GetTotalHours("-30:15"); 
संबंधित मुद्दे