从许多组合中的字符串解析日期和时间

时间:2010-09-16 09:58:51

标签: c# parsing datetime

我需要从字符串中解析日期和时间。问题是字符串可以有任何可能的格式。但我也得到格式字符串。

所以我得到了:

Date = "9/15/2010"
Time = "16:12:45"
DateFormat = "M/dd/yyyy"
TimeFormat = "h:mm:ss"
TimeZone = "+2:00:00"  // +/- and time in TimeFormat

但我在解析这些字符串时遇到了一些问题。

我无法解析时间

DateTime.ParseExact("16:12:45","h:mm:ss",null,DateTimeStyles.None);

不起作用并导致FormatException。这次电话有什么问题?

如果DateFormat包含斜杠,我需要转义它们@"M\/dd\/yyyy"。还有其他需要转义的字符吗?

我可以将整个DateTime解析为一个吗?有点像:

DateTime.ParseExact(Date+' '+Time+' '+TimeZone,DateFormat+' '+TimeFormat+' +'+TimeFormat,null,DateTimeStyles.None);

4 个答案:

答案 0 :(得分:2)

  

这次电话有什么问题?

“h:mm:ss”格式字符串要求hours元素采用12小时格式(h);字符串中的小时数为24小时格式,因此您需要使用H代替:

DateTime.ParseExact("16:12:45", "H:mm:ss", null, DateTimeStyles.None);
  

是否还有其他需要转义的字符?

字符串中与a format specifier发生冲突的任何文字字符都需要进行转义。例如,/是日期分隔符,\/表示文字/字符; :是时间分隔符,但\:表示文字:字符; y是年度说明符之一,但\y是文字y字符。

  

我可以将整个DateTime解析为一个吗?

答案 1 :(得分:0)

您知道原始字符串属于哪种文化吗?如果这样做,您可以在调用Parse()

时指定特定于区域性的DateTimeStyle
DateTime date = DateTime.Parse("<your specific date>", System.Globalization.CultureInfo.GetCultureInfo("<your culture>").DateTimeFormat);

答案 2 :(得分:0)

创建自定义DateTimeFormatInfo并将其传递到DateTime.Parse。像这样:

string dateValue = string.Format("{0} {1}", "9/15/2010", "16:12:45");
var customDateTimeFormatInfo = new DateTimeFormatInfo();
customDateTimeFormatInfo.FullDateTimePattern = string.Format("{0} {1}", "M/dd/yyyy", "h:mm:ss");
DateTime dt = DateTime.Parse(dateValue, customDateTimeFormatInfo);

无需转义并处理您的“h:mm:ss”罚款,无需修改。

答案 3 :(得分:0)

这个怎么样?

var @return = (DateTime?)null;
if (source != null)
{
    source = source.Trim();
    if (source.Length > 0)
    {
        var fs = new string[]
        {
            "d MMMM yyyy h:mm tt",
            "d MMMM yyyy h:mm:ss tt",
            "d MMMM yyyy HH:mm",
            "d MMMM yyyy HH:mm:ss",
            "d MMMM yyyy",
            "d/M/yy h:mm tt",
            "d/M/yy h:mm:ss tt",
            "d/M/yy HH:mm",
            "d/M/yy HH:mm:ss",
            "d/M/yy",
            "d/M/yyyy HH:mm",
            "d/M/yyyy HH:mm:ss",
            "d/M/yyyy h:mm:ss tt",
            "d/M/yyyy",
            "d/M/yyyy h:mm tt",
            "d-MMMM-yy HH:mm",
            "d-MMMM-yyyy h:mm tt",
            "d-MMMM-yyyy h:mm:ss tt",
            "d-MMMM-yyyy HH:mm",
            "d-MMMM-yyyy HH:mm:ss",
            "d-MMMM-yyyy",
            "d-MMM-yy",
            "d-MMM-yy h:mm tt",
            "d-MMM-yy h:mm:ss tt",
            "d-MMM-yy HH:mm",
            "d-MMM-yy HH:mm:ss",
            "d-MMM-yyyy",
            "d-M-yy h:mm tt",
            "d-M-yy h:mm:ss tt",
            "d-M-yy HH:mm",
            "d-M-yy HH:mm:ss",
            "d-M-yy",
            "d-M-yyyy",
            "yyyy/M/d h:mm tt",
            "yyyy/M/d h:mm:ss tt",
            "yyyy/M/d HH:mm",
            "yyyy/M/d HH:mm:ss",
            "yyyy/M/d",
            "yyyy-M-d h:mm tt",
            "yyyy-M-d h:mm:ss tt",
            "yyyy-M-d HH:mm",
            "yyyy-M-d HH:mm:ss",
            "yyyy-M-d",
            "yyyy-MM-ddTHH:mm:ss",
        };
        @return = DateTime.ParseExact(source, fs,
            System.Globalization.CultureInfo.CurrentCulture,
            System.Globalization.DateTimeStyles.None);
    }
}
return @return;