【问题标题】:Converting string to valid DateTime将字符串转换为有效的日期时间
【发布时间】:2015-05-12 05:27:38
【问题描述】:

我知道有很多关于此的问题,但我整天都在努力让这种转换发挥作用,并且在应用此处发布的同一问题的答案时没有运气。每次我尝试将字符串解析为日期时间时,都会收到“字符串未被识别为有效日期时间”异常。如果我使用 Convert.ToDateTime,我可以从我的字符串中返回一个日期,但我也需要 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? 感谢所有帮助

【问题讨论】:

  • 好吧,如果你的日期字符串中有-,你为什么要告诉c#寻找/
  • 查看ParseExact中的格式。看看你的字符串。再次回顾你的格式。得出一个明显的结论。
  • 阅读Jon Skeet's blog post。这可能属于“广泛的模式不兼容”。
  • @CharlesMager 哇!这非常适用于当前的情况,我没想到,这太棒了。

标签: c#


【解决方案1】:

试试这个...

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();

结果:

【讨论】:

  • 你能解释更多关于DateTimeStyles.RoundtripKind的信息吗?
【解决方案2】:

您使用的格式字符串 ("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】:

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

    如果您需要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);
    

    【讨论】:

      【解决方案4】:

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

      1. 在测试文字字符串中使用/ 而不是-
      2. 在测试文字字符串中有一个空格而不是T
      3. 与测试文字字符串末尾的 Z 不匹配。
      4. 此外,它不是您的测试文字字符串的 yyyy-MM-dd 顺序。

      @Shar1er80 的解决方案很好,您不必为 ParseExact 指定正确的解析格式字符串。我建议你这样做。

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

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

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

      【讨论】:

      • 不仅如此,他还有yyyy DD mm,而预期是mm DD yyyy。这是两种完全不同的格式。
      • 是的,刚刚也添加了。
      • 感谢您的解释,以及解释 Z @DWright 的链接。这很有帮助。
      猜你喜欢
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 2013-06-28
      • 2015-09-17
      • 1970-01-01
      • 2022-08-18
      • 2017-08-31
      相关资源
      最近更新 更多