none
請問如何使用 DateTime.ParseExact 解析純數字的中華民國日期? RRS feed

  • 問題

  • 各位好,

    我想將某一字串代表著中華民國的日期 "1050402",

    解析為 DateTime 物件(相等於西元 2016/04/02),

    目前這樣寫不行:

                var ci = new CultureInfo("zh-TW", true);
                ci.DateTimeFormat.Calendar = new TaiwanCalendar();
                var d = DateTime.ParseExact("1050402", "yyyMMdd", ci);


    測試過在 Year 後面加上空白可解析

    var d = DateTime.ParseExact("105 0402", "yyy MMdd", ci);

    但來源的字串沒有空白,就是 "1050402",

    雖然可以透過其他字串方法方式擷取民國年、月、日,在透過 TaiwanCalendar 轉換為 DateTime,

    但我想知道 DateTime.ParseExact 的 format 參數,是否就能簡單做到這樣的解析,感謝。

    2017年4月8日 下午 05:28

解答

  • 把年份補成四位數,

                string s = "1050402";
                s = s.PadLeft(8, '0');
                var ci = new CultureInfo("zh-TW", true);
                ci.DateTimeFormat.Calendar = new TaiwanCalendar();
                 var d = DateTime.ParseExact(s, "yMMdd", ci);
                Console.WriteLine(d);
                Console.ReadLine();


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已標示為解答 503 2017年4月9日 下午 02:13
    2017年4月8日 下午 09:02
    版主

所有回覆

  • 在還不知道如何直接使用 DateTime 原生靜態方法解析純數字字串之前,

    目前我暫時先處理過來源字串後,在解析純數字中華民國年月日的方法之一,提供給大家參考:

                var s = "1050402";
                s = Regex.Replace(s, @"^(\d{1,})(\d{2})(\d{2})$", "$1/$2/$3");
    
                var ci = new CultureInfo("zh-TW", true);
                ci.DateTimeFormat.Calendar = new TaiwanCalendar();
                var d = DateTime.Parse(s, ci);

    2017年4月8日 下午 06:16
  • 把年份補成四位數,

                string s = "1050402";
                s = s.PadLeft(8, '0');
                var ci = new CultureInfo("zh-TW", true);
                ci.DateTimeFormat.Calendar = new TaiwanCalendar();
                 var d = DateTime.ParseExact(s, "yMMdd", ci);
                Console.WriteLine(d);
                Console.ReadLine();


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已標示為解答 503 2017年4月9日 下午 02:13
    2017年4月8日 下午 09:02
    版主
  • 把年份補成四位數,

                string s = "1050402";
                s = s.PadLeft(8, '0');
                var ci = new CultureInfo("zh-TW", true);
                ci.DateTimeFormat.Calendar = new TaiwanCalendar();
                 var d = DateTime.ParseExact(s, "yMMdd", ci);
                Console.WriteLine(d);
                Console.ReadLine();


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    感謝,將年份補成四位數後正常,

    請問一下在這種例子下,怎麼知道年份補成四位數才能解析的,是否有規範可參考?

    2017年4月9日 上午 01:49
  • 感謝分享,

    但還是不明白為什麼民國年的部分需要四位數數字,

    才能在純數字字串解析成功。

    2017年4月9日 上午 09:27
  • ParseExact 的內部實作有一段會檢查 string 長度,也許和這有關吧。


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2017年4月9日 上午 10:46
    版主