2011-02-09 14 views
7

में System.DateTime अगर मैं कमांड लाइन से एक स्ट्रिंग हो और यह इस तरह दिखता है:परिवर्तित स्ट्रिंग एफ #

'1-1-2011' 

कैसे मैं एफ # में दिनांक समय वस्तु है कि स्ट्रिंग में बदल सकते हैं?

+2

संभव डुप्लिकेट [एफ # - पार्स दिनांकों] (http: // stackoverflow.com/questions/4158077/f-parse-dates) –

+0

@ सेबेस्टियन पी - इसी तरह, लेकिन मुझे एक सटीक डुप्लिकेट पर विश्वास नहीं है, दोनों प्रश्न पूछते हैं कि विभिन्न दिनांक स्वरूपों को कैसे पार्स करना है, जो वास्तव में विभिन्न उत्तरों की ओर जाता है। –

उत्तर

8

आप इसे के रूप में बस के रूप में कर सकता है:

let dateTime = System.DateTime.Parse "1-1-2011" 
8

क्या 7sharp9 लिखा एक अच्छी बात यह है जोड़ने के लिए, यदि आप भी विफलताओं हैंडल करना चाहते हैं, तो आप लिख सकते हैं:

match System.DateTime.TryParse "1-1-2011" with 
| true, date -> printfn "Success: %A" date 
| false, _ -> printfn "Failed!" 

यह स्पष्ट नहीं है, क्योंकि TryParse विधि में अंतिम तर्क के रूप में byref<DateTime> है (और इसका उपयोग C12 में out का उपयोग करके किया जाता है), लेकिन F # आपको इस तरह की विधि को कॉल करने की अनुमति देता है।

19

अपने विशिष्ट आवश्यकता पर निर्भर करता है, नेट के DateTime वर्ग DateTime उदाहरणों को तार बदलने के लिए कई स्थिर तरीकों है, इन DateTime.Parse, DateTime.ParseExact, और DateTime.TryParse और उनके कई भार के हैं।

@ 7sharp9 ने DateTime.Parse पर सीधे विधि कॉल के साथ दिनांक पार्सिंग करने का सबसे बुनियादी तरीका प्रदर्शित किया। लेकिन जहां एफ # में दिलचस्प चीजें मिलती हैं DateTime.TryParse के साथ। जबकि DateTime.Parse पार्स विफल होने पर अपवाद फेंक देगा, DateTime.TryParse का सबसे सरल अधिभार हस्ताक्षर string * byref<DateTime> -> bool है जो वापस लौटाएगा कि पार्स byref तर्क को सही स्थिति में byref तर्क को सक्षम करता है या इसके डिफ़ॉल्ट मान (null इस मामले में) अन्यथा । हालांकि, एफ # में इसका उपयोग करने के लिए सिंटैक्स बोझिल है (और वास्तव में यह किसी भी .NET भाषा से सुखद नहीं है), इसलिए एफ # भाषा को एक विशेष सुविधा के साथ डिजाइन किया गया था जो इन्हें विधियों के लिए बहुत अच्छे कॉलिंग सम्मेलन की अनुमति देता है जैसे @ थॉमस पेट्रिसक ने इशारा किया बाहर।

लेकिन यहां तक ​​कि एफ # (बूल, परिणाम) रिटर्न टाइप पैटर्न आदर्श नहीं है। यदि कोई पार्स विफल रहता है तो अधिकांश समय आपको डिफ़ॉल्ट मान की आवश्यकता नहीं होती है। DateTime.TryParse के लिए एक अच्छा हस्ताक्षर string -> option<DateTime> होगा। सौभाग्य से, हम आसानी से DateTime विस्तार कर सकते हैं हम चाहते हैं:

type System.DateTime with 
    static member TryParseOption str = 
     match DateTime.TryParse str with 
     | true, r -> Some(r) 
     | _ -> None 

हम तो जैसे ऊपर एक्सटेंशन का उपयोग:

match System.DateTime.TryParseOption "11/11/11" with 
| Some r -> stdout.WriteLine r 
| None -> stdout.WriteLine "none" 

कौन सा एफ # सम्मेलनों के साथ और अधिक संगत है (जैसे List.tryFind, उदाहरण के लिए)। लेकिन यहां तक ​​कि यह "बेहतर" हो सकता है। ध्यान दें कि हम प्रयास पार्स के परिणाम पर कैसे मेल खाते हैं। आंशिक सक्रिय पैटर्न का उपयोग करना (बेशक!), हम कोशिश कर पार्स की एक पूरी कक्षा को लपेट सकते हैं और मैच को अधिक लचीलापन के लिए मैच केस में ले जा सकते हैं। निम्नलिखित

open System 
let (|DateTime|_|) str = 
    match DateTime.TryParse str with 
    | true, dt -> Some(dt) 
    | _ -> None 

let (|Int|_|) str = 
    match Int32.TryParse str with 
    | true, num -> Some(num) 
    | _ -> None 

let (|Float|_|) str = 
    match Double.TryParse str with 
    | true, num -> Some(num) 
    | _ -> None 

इनका प्रयोग करते हुए ले लो, हम एक साफ थोड़ा सांत्वना आवेदन लिख सकते हैं:

let rec loop() = 
    stdout.WriteLine " 
Please select an option: 
    1) Parse something 
    2) Exit 
" 
    match stdin.ReadLine() with 
    | Int 1 -> 
     stdout.WriteLine "Enter something to parse: " 
     match stdin.ReadLine() with 
     | Int num -> stdout.WriteLine("Successfully parsed int: {0}", num) 
     | Float num -> stdout.WriteLine("Successfully parsed float: {0}", num) 
     | DateTime dt -> stdout.WriteLine("Successfully parsed DateTime: {0}", dt) 
     | _ -> stdout.WriteLine "Parse Failed!" 
     loop() 
    | Int 2 -> 
     stdout.WriteLine "Now exiting" 
    | _ -> 
     stdout.WriteLine "Invalid option, please try again" 
     loop() 

सूचना के लिए मुख्य बात नेस्टेड मैच, जहां Int, Float, DateTime प्रदर्शन उनकी कोशिश भीतर पार्स करता है एक ही मैच अभिव्यक्ति।

इन सक्रिय पैटर्न के अन्य स्वच्छ अनुप्रयोगों भी उदाहरण के लिए, हम संक्षेप एक साथ फिल्टर करने और तारीख स्ट्रिंग की एक सूची मैप कर सकते हैं कर रहे हैं,

> ["11/23/2003"; "not a date"; "1/1/23 23:23pm"] |> Seq.choose(|DateTime|_|);; 
val it : seq<DateTime> = 
    seq 
    [11/23/2003 12:00:00 AM {Date = 11/23/2003 12:00:00 AM; 
          Day = 23; 
          DayOfWeek = Sunday; 
          DayOfYear = 327; 
          Hour = 0; 
          Kind = Unspecified; 
          Millisecond = 0; 
          Minute = 0; 
          Month = 11; 
          Second = 0; 
          Ticks = 632051424000000000L; 
          TimeOfDay = 00:00:00; 
          Year = 2003;}; 
    1/1/2023 11:23:00 PM {Date = 1/1/2023 12:00:00 AM; 
          Day = 1; 
          DayOfWeek = Sunday; 
          DayOfYear = 1; 
          Hour = 23; 
          Kind = Unspecified; 
          Millisecond = 0; 
          Minute = 23; 
          Month = 1; 
          Second = 0; 
          Ticks = 638082121800000000L; 
          TimeOfDay = 23:23:00; 
          Year = 2023;}] 
की
संबंधित मुद्दे