将字符串转换为有效的DateTime

时间:2015-05-11 20:53:51

标签: c#

我知道有很多关于此问题的问题,但我一直在努力让这种转换工作,并且在将答案应用于此处发布的同一问题时没有运气。每次我尝试将字符串解析为DateTime时,我得到“字符串未被识别为有效的DateTime”异常。如果我使用Convert.ToDateTime,我可以从我的字符串中获取一个Date,但我也需要hh:ss。

这是我的简化代码,它毁了我的一天:

var test = "2015-05-08T05:00Z";

DateTime testTime = new DateTime();
//testTime = Convert.ToDateTime(test);
testTime = DateTime.ParseExact(test, "mm/DD/yyyy HH:ss",
System.Globalization.CultureInfo.InvariantCulture);

Console.WriteLine(testTime);

为什么尝试转换时此字符串无法识别为有效的DateTime? 感谢所有帮助

4 个答案:

答案 0 :(得分:2)

试试这个......

var test = "2015-05-08T05:00Z";
DateTime testTime = new DateTime();
testTime = DateTime.Parse(test, null, System.Globalization.DateTimeStyles.RoundtripKind);

Console.WriteLine(testTime);
Console.ReadLine();

甚至使用DateTime.ParseExact()

var test = "2015-05-08T05:00Z";

DateTime testTime = new DateTime();
testTime = DateTime.ParseExact(test, "yyyy-MM-ddTHH:ssZ", System.Globalization.CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind);

Console.WriteLine(testTime);
Console.ReadLine();

结果:

enter image description here

答案 1 :(得分:0)

您正在进行精确解析,这意味着解析格式字符串必须与日期文字字符串完全匹配。但是你的解析格式字符串在ParseExact

  1. 在测试文字字符串中使用/而不是-
  2. 在测试文字字符串
  3. 中有空格而不是T
  4. 与测试文字字符串末尾的Z不匹配。
  5. 此外,它不是您的测试文字字符串的yyyy-MM-dd顺序。
  6. @ Shar1er80的解决方案很好,让您不必为ParseExact指定正确的解析格式字符串。我建议继续这样做。

    但是,如果你想使用ParseExact,你需要这样做:

    testTime = DateTime.ParseExact(test, "yyyy-MM-ddTHH:ssZ",
        System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.AdjustToUniversal);
    

    请注意,我添加了DateTimeStyle AdjustToUniversal以确保您的时间被解释为UTC。解析格式字符串中的Z就是消耗Z.有关Z问题的更多信息,请参阅https://stackoverflow.com/a/833143/49251。实际上,Z本身并不是格式字符串的一部分。

答案 2 :(得分:0)

您正在使用的格式字符串("mm/DD/yyyy HH:ss")不会以任何方式匹配您的输入。

您是否看过DateTime.ParseExact文档?你可以尝试这样的事情:

testTime = DateTime.ParseExact(test, "yyyy-MM-ddTHH:ssZ", 
    System.Globalization.CultureInfo.InvariantCulture, 
    System.Globalization.DateTimeStyles.AssumeUniversal);

几点说明:

  1. 如果要在下一行解析它,设置testTime = new DateTime()没有意义。只需完全放弃该行并使用var testTime = DateTime.ParseExact(...);
  2. 您确定HH:ss是您想要的吗?这似乎是写一个时间的一种非常奇怪的方式。 HH:mmmm:ss会更有意义。

答案 3 :(得分:0)

您应该修复预期的模式并考虑时区。

如果您需要DateTimeKind.Local的日期时间:

var date = DateTime.ParseExact("2015-05-08T05:00Z", "yyyy-MM-dd'T'HH:mm'Z'",
   CultureInfo.InvariantCulture);

如果您需要DateTimeKind.Utc的日期时间:

var date = DateTime.ParseExact("2015-05-08T05:00Z", "yyyy-MM-dd'T'HH:mm'Z'",
   CultureInfo.InvariantCulture,
    DateTimeStyles.AssumeUniversal 
  | DateTimeStyles.AdjustToUniversal);