C# 将字符串转换为有效的日期时间

C# 将字符串转换为有效的日期时间,c#,C#,我知道关于这个问题有很多问题,但我整天都在努力让这个转换工作,在这里发布的同一个问题的答案应用时没有运气。每次尝试将字符串解析为DateTime时,都会出现“字符串未被识别为有效的DateTime”异常。如果我使用Convert.ToDateTime,我可以从字符串中获取日期,但我还需要hh:ss 以下是我的简化代码,它毁了我的一天: var test = "2015-05-08T05:00Z"; DateTime testTime = new DateTime(); //testTime =

我知道关于这个问题有很多问题,但我整天都在努力让这个转换工作,在这里发布的同一个问题的答案应用时没有运气。每次尝试将字符串解析为DateTime时,都会出现“字符串未被识别为有效的DateTime”异常。如果我使用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);
为什么在尝试转换时无法将此字符串识别为有效的日期时间?
非常感谢所有帮助

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

  • 在测试文本字符串中使用
    /
    而不是
    -
  • 在测试文本字符串中有一个空格,而不是
    T
  • 与测试文字字符串末尾的
    Z
    不匹配
  • 此外,它不是测试文字字符串的yyyy-MM-dd顺序
  • @Shar1er80的解决方案很好,使您无需为ParseExact指定正确的解析格式字符串。我建议你这样做

    但是,如果要使用ParseExact,则需要执行以下操作:

    testTime = DateTime.ParseExact(test, "yyyy-MM-ddTHH:ssZ",
        System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.AdjustToUniversal);
    
    请注意,我添加了
    AdjustToUniversal
    DateTimeStyle
    ,以确保您的时间被解释为UTC。解析格式字符串中的Z只是用来使用Z。有关Z本身实际上不是格式字符串的一部分的问题的更多信息,请参阅。

    试试这个

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

    结果:


    您使用的格式字符串(
    “mm/DD/yyyy HH:ss”
    )与您的输入不匹配

    你看过文件了吗?您可以尝试以下方法:

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

  • 如果要在下一行对其进行解析,那么设置
    testTime=new DateTime()
    没有意义。只需完全删除该行并使用
    var testTime=DateTime.ParseExact(…)
  • 你确定
    HH:ss
    就是你想要的吗?这似乎是一种非常奇怪的时间书写方式
    HH:mm
    mm:ss
    更有意义

  • 你应该修正你的预期模式,并考虑时区

    如果您需要的日期时间为
    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);
    

    如果您的日期字符串中有
    -
    ,为什么要让c查找
    /
    ?请查看
    中的格式。看看你的绳子。再次回顾一下您的格式。得出一个明显的结论。阅读。这可能属于“广泛模式不兼容”的范畴。@CharlesMager-Wow!这很好地适用于当前的情况,我没想到,那太棒了。不仅如此,他有yyyy DD mm,而预期的是mm DD yyyy。这是两种完全不同的格式。是的,刚刚添加了这一格式。感谢您的解释,以及解释Z@DWright的链接。这非常有帮助。请您详细解释一下
    DateTimeStyles.RoundtripKind
    var date = DateTime.ParseExact("2015-05-08T05:00Z", "yyyy-MM-dd'T'HH:mm'Z'",
       CultureInfo.InvariantCulture,
        DateTimeStyles.AssumeUniversal 
      | DateTimeStyles.AdjustToUniversal);