DateTime.ParseExact出错

时间:2016-05-04 07:24:36

标签: c# .net

我在oracle数据库中有一个日期,我查询。这个日期如下:

5/3/2016 (after I remove the time portion)

我尝试将此日期转换为DateTime。我正在使用:

ParseExact(String, String, IFormatProvider)

我做错了什么,我无法弄清楚。 我的代码如下所示。请注意,名为" res"的变量具有如上所述的值5/3/2016

try {
    while(reader.Read()) {
        string res = reader[0].ToString().Substring(0, 8);
        mailer.SendSmtpMail4dev("Result: " + res);
        mailer.SendSmtpMail4dev("Result: " + DateTime.ParseExact(res, "dd-MM-yyyy", System.Globalization.CultureInfo.InvariantCulture));
    }
} catch(Exception e) { ...

6 个答案:

答案 0 :(得分:2)

for DateTime.ParseExact输入字符串的格式和格式字符串应该相同,所以请使用:

DateTime.ParseExact(res, "d/M/yyyy", System.Globalization.CultureInfo.InvariantCulture);

在您的情况下,提供的日期为5/3/2016,您指定的格式为"dd-MM-yyyy",无法进行此类转换。如果您需要更改格式,则表示您可以执行以下操作:

string res = "5/2/2016";
DateTime givenDate = DateTime.ParseExact(res, "d/M/yyyy", System.Globalization.CultureInfo.InvariantCulture);
string newFormatedDate = givenDate.ToString("dd-MM-yyyy");

答案 1 :(得分:1)

由于您的res日期为dd/MM/yyyy格式,但您尝试强制转换为dd-MM-yyyy,因此在DateTime.ParseExact()中您必须提供相同格式的日期时间和格式字符串,正确的代码将是这样的

mailer.SendSmtpMail4dev("Result: " + DateTime.ParseExact(res, "dd/MM/yyyy", System.Globalization.CultureInfo.InvariantCulture).ToString("dd-MM-yyyy"));

答案 2 :(得分:1)

使用:

DateTime.ParseExact(res, "d/M/yyyy", System.Globalization.CultureInfo.InvariantCulture);

有关详细信息,请参阅MSDN article

答案 3 :(得分:1)

使用

DateTime.ParseExact(res, "d/M/yyyy", System.Globalization.CultureInfo.InvariantCulture).ToString("dd-MM-yyyy")

答案 4 :(得分:0)

如果您有日期,为什么要将其转换为String

// What if server's NLS_* settings are changed? What does 8 stand for?
reader[0].ToString().Substring(0, 8);

再次Parse?如果reader[0]是日期,请使用DateTime

try {
  while(reader.Read()) {
    // 0th field is date, then treat it as being date
    DateTime date = Convert.ToDateTime(reader[0]);

    //TODO: put the right formats here
    mailer.SendSmtpMail4dev("Result: " + date.ToString("dd-MM-yyyy"));
    mailer.SendSmtpMail4dev("Result: " + date.ToString("dd-MM-yyyy"));
  }
}
catch(Exception e) { 
  ...
}

答案 5 :(得分:0)

上面标出了我的问题的解决方案,但我只是想说一些重要的事情,以便其他人可以节省一些时间。一些建议的解决方案,建议做:DateTime.ParseExact(res, "dd/MM/yyyy" ...)这似乎也在网上的许多其他例子中,所以我不是说它是错的。然而。这对我来说不起作用,我花了一些时间,在我尝试之前:

DateTime.ParseExact(res, "d/M/yyyy" ...) 

请注意,在后面的解决方案中,只有一个d和一个M. 但是我的主要问题,就像每个人都指出的那样,可能是我正在使用的:

"dd-MM-yyyy" instead of "dd/MM/yyyy" (which is the same format as the oracle value)

希望这会为你节省一些时间