C#中特定格式的日期时间值解析

3

有一个字符串 2020-12-27 20:00:00,应用程序必须将其解析为 DateTime 结构。期望的格式是 yyyy-MM-dd hh:mm:ss

我使用以下代码:

DateTime.TryParseExact(timeString, "yyyy-MM-dd hh:mm:ss", 
                       CultureInfo.InvariantCulture, DateTimeStyles.None, out time)

但是它不起作用。TryParseExact返回false。 有人知道为什么吗?
3个回答

8
你需要使用 HH 指定符代替 hhHH 指定符 用于 24小时制 格式(0023),而 hh 指定符 用于 12小时制 格式(0112)。
string s = "2020-12-27 20:00:00";
DateTime dt;
if(DateTime.TryParseExact(s, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture,
                          DateTimeStyles.None, out dt))
{
    // 27.12.2020 20:00:00
}

6

hh 是12小时制,应该使用 HH 来表示24小时制。

所以你的示例应该是:

DateTime.TryParseExact(timeString, "yyyy-MM-dd HH:mm:ss", 
                       CultureInfo.InvariantCulture, DateTimeStyles.None, out time)

谢谢!我知道这只是一些微不足道的小事。 - Andrej B.

0

您可以使用我编写的方法来将任何格式的字符串转换为DTs:

public static DateTime? parseDate(this string date, string format = @"ddMMyyyy")
{                    
    format += "HHmmss";
    DateTime dt;            
    try 
    {
        string day = date.Substring(format.IndexOf('d'), 2);
        string month = date.Substring(format.IndexOf('M'), 2);
        string year = date.Substring(format.IndexOf('y'), 4);               
        string hour = date.Length - 1 > format.IndexOf('H')? date.Substring(format.IndexOf('H'), 2) : "00";
        string minute = date.Length - 1 > format.IndexOf('m')? date.Substring(format.IndexOf('m'), 2) : "00";
        string second = date.Length - 1 > format.IndexOf('s')? date.Substring(format.IndexOf('s'), 2) : "00";

        dt = DateTime.Parse(year + "/" + month + "/" + day + " " + hour + ":" + minute + ":" + second);
    }
    catch { return null; }
    return dt;
}

使用方法:

string date = "2014ASDA04QWER05zxc";
DateTime? dt = date.parseDate("yyyyxxxxMMxxxxdd");

结果:2014/04/05 00:00
但是你是对的,也许你应该只使用 DateTime.ParseExact 和 HH 而不是 hh,因为我的方法对此过于复杂了。
20,000个随机日期的两种方法的小比较: enter image description here

哇..这个方法到底是干什么用的?o.O 通常情况下,将字符串分成片段来解析为DateTime是一个不好的想法。 - Soner Gönül
我手头有三种不同的日期时间字符串格式,需要将它们转换为可空日期时间类型,因此我创建了自己的扩展方法来实现这个目的 :) - Fabjan
1
这很无用。这段代码可能适用于您的情况,但它根本不可重用或国际化(提示:DateTime.Parse()格式在几乎任何语言环境下都不起作用,人们想要使用其他格式而不是此代码支持的那个小子集)。您知道DateTime.TryParseExact有一个重载可以接受多个格式吗?人们还可以选择清理输入,如果垃圾字符位于固定位置。 - CodeCaster
好的,也许这不是最佳方法,但它能够正常工作并且在性能方面还可以。我没有尝试使用TryParse来解析像“2014ASDA04QWER05zxc”这样的日期。也许它能够正常工作,也许不能。 - Fabjan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接