解析字符串到datetime时出错

时间:2017-01-04 14:59:22

标签: c# .net datetime

我在CSV文件中有一个日期时间值,下面是示例数据:

20/06/2016 11:52
21/06/2016 11:52
22/06/2016 11:52

当我尝试解析此日期时间时,我收到错误:

  

字符串未被识别为有效的DateTime。

我不确定这个日期的格式是什么,但我总是想在我的应用程序将使用的文化中解析它。所以基于当前的文化,我想解析我的约会。

这就是我的尝试,但是如上所述得到错误:

string row = "20/06/2016 11:52" 

尝试1

CultureInfo culture = CultureInfo.CurrentCulture;
  DateTimeStyles styles = DateTimeStyles.None;
  DateTime dateValue;
  DateTime.TryParse(rowValue, culture, styles, out dateValue); // {1/1/0001 12:00:00 AM}

尝试2

 DateTimeFormatInfo usDtfi = new CultureInfo(culture.Name, false).DateTimeFormat;
  var l = Convert.ToDateTime(rowValue, usDtfi); //String was not recognized as a valid DateTime
  var g = DateTime.Parse(rowValue, usDtfi);//String was not recognized as a valid DateTime

以上所有这些都是失败的,我希望确切的日期,并希望存储在我的SQL Server数据库表中。

我的系统日期时间格式为: mm / dd / yy

我已经看到过如下问题:

String was not recognized as a valid DateTime " format dd/MM/yyyy"

Datetime format Issue: String was not recognized as a valid DateTime

但所有这些答案都是指定日期格式,但我不知道格式是什么;这就是我试图从当前文化中发现的原因。我不确定我是否正在以正确的方式思考。

2 个答案:

答案 0 :(得分:1)

如果您100%确定格式始终相同,则可以使用方法ParseExact,如:

var parsedDate = DateTime.ParseExact(row, "dd/MM/yyyy hh:mm", CultureInfo.InvariantCulture);

答案 1 :(得分:1)

如果您确定所遇到的每个字符串都采用正确的格式,但您只是不知道哪一个,那么您可以做的一件事就是获取所有不同格式的数组。机器并在解析精确方法中使用它:

var formats = (from CultureInfo ct in CultureInfo.GetCultures(CultureTypes.AllCultures)
               select ct.DateTimeFormat.GetAllDateTimePatterns()).SelectMany((x) => x).ToArray();
DateTime test = DateTime.ParseExact("20/06/2016 11:52", formats, CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal);

我机器上的代码生成超过26,000种格式。只要字符串跟随其中一个字符串就会被接受。

如果获得正确的格式不一致,你可以走这条路:

var formats = (from CultureInfo ct in CultureInfo.GetCultures(CultureTypes.AllCultures)
               select ct.DateTimeFormat);
string dateString = "20/06/2016 11:52";
DateTime temp = new DateTime(0);
foreach (DateTimeFormatInfo dfi in formats)
{
    if (DateTime.TryParseExact(dateString, dfi.GetAllDateTimePatterns(), dfi, DateTimeStyles.None, out temp))
    {
        break;
    }
}
if(temp == new DateTime(0))
{
    //save string to get it's format
}