/// <summary> /// 將日期當作是「西元」年處理。 /// </summary> /// <param name="dtString">日期字串。 </param> /// <param name="method">如果日期缺少的欄位用何種方式補上。</param> /// <returns></returns> public static DateTime? ParseGregorian(string dtString, PaddingMethod method) { PatternMatcher matcher = new PatternMatcher(dtString.Trim()); if (!matcher.IsSuccess) return null; else { string assembly; if (method == PaddingMethod.None) { foreach (Group each in matcher.EachGroup()) if (!each.Success) return null; assembly = matcher.GetReassemblyString(); } else { int year, month, day, hour, minute, second; DateTimePaddingInfo padding = new DateTimePaddingInfo(method); ExtractInfo(matcher, padding, out year, out month, out day, out hour, out minute, out second); assembly = year + "/" + month + "/" + day + " " + hour + ":" + minute + ":" + second; } DateTime result; if (DateTime.TryParse(assembly, DateTimeFormatInfo.InvariantInfo, DateTimeStyles.None, out result)) return result; else return null; } }
private static void ExtractInfo(PatternMatcher matcher, DateTimePaddingInfo padding, out int year, out int month, out int day, out int hour, out int minute, out int second) { if (matcher.ContainField(DateTimeField.Year)) year = matcher.GetFieldValue(DateTimeField.Year); else year = padding.GetYear(); if (matcher.ContainField(DateTimeField.Month)) month = matcher.GetFieldValue(DateTimeField.Month); else month = padding.GetMonth(); if (matcher.ContainField(DateTimeField.Day)) day = matcher.GetFieldValue(DateTimeField.Day); else day = padding.GetDay(year, month); if (matcher.ContainField(DateTimeField.Hour)) hour = matcher.GetFieldValue(DateTimeField.Hour); else hour = padding.GetHour(); if (matcher.ContainField(DateTimeField.Minute)) minute = matcher.GetFieldValue(DateTimeField.Minute); else minute = padding.GetMinute(); if (matcher.ContainField(DateTimeField.Second)) second = matcher.GetFieldValue(DateTimeField.Second); else second = padding.GetSecond(); }