如何解析具有各种字符的日期时间字符串作为日期分隔符?

Cyb*_*ist 0 c# date-formatting

注意 - 是的,2011年的问题是我的问题被建议作为这里的一个,我可以使用的答案,但下面的Zohar答案是迄今为止最好的,并且可能考虑到C#的进步7年前不存在的.因此问题确实是一个骗局,但最好的答案是在这里找到,而不是在那里.

我正在阅读用相机拍摄的数码照片中的EXIF信息,以及我的扫描仪扫描的照片,并且发现当佳能扫描仪用"/"格式化日期时,Fujifilm相机用":"格式化它们.我需要将这些字符串解析为DateTime,并且想要一个非常简短的方法.我不知道其他制造商是否提供具有不同日期格式的EXIF数据,例如连字符(" - "),句点(".")或其他一些分隔符,以及我应该如何允许所有这些?我知道一种方法(try-catch块寻找FormatException),但是有更好的方法吗?

顺便说一句,EXIF标准指定yyyy:mm:dd,冒号(:)用于分隔符,但如上所述,我的佳能扫描仪(Canoscan 9000F Mk II)使用倾斜(/).据推测,其他制造商可能会使用不同的分隔符.

相机提供:"2008:10:06 16:00:07"

我可以做的:

DateTime dt = DateTime.ParseExact(str, "yyyy:MM:dd HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture);
Run Code Online (Sandbox Code Playgroud)

或尝试捕获以下几种变体:

try
{
    dt = DateTime.ParseExact(str, "yyyy:MM:dd HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture);
}
catch (FormatException)
{
    try
    {
        dt = DateTime.ParseExact(str, "yyyy/MM/dd HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture);
    }
    catch (FormatException)
    {
        try
        {
            dt = DateTime.ParseExact(str, "yyyy-MM-dd HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture);
        }
        catch (FormatException ex)
        {
            throw ex;
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

不要让我开始使用可能发生的所有其他格式!

Zoh*_*led 5

对模糊格式要非常小心.如果一个设备返回yyyy/MM/dd而另一个设备返回,yyyy/dd/MM您可能会发现自己返回错误的结果

我建议TryParseExact而不是ParseExact在try..catch块中.

我链接的重载可以将一个字符串数组作为可能的格式,并且如果输入字符串完全匹配(至少)其中一个,则将成功解析.

var formats = new string[] 
{
    "yyyy:MM:dd HH:mm:ss",
    "yyyy/MM/dd HH:mm:ss",
    "yyyy-MM-dd HH:mm:ss"
};

DateTime dt;
if(
   DateTime.TryParseExact(
       str, 
       formats, 
       System.Globalization.CultureInfo.InvariantCulture, 
       DateTimeStyles.AssumeLocal, // Please note AssumeLocal might be wrong here...
       out dt)
 ) // parsed successfully...
Run Code Online (Sandbox Code Playgroud)