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

时间:2018-04-04 12:32:59

标签: c# date-formatting

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

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

顺便说一句EXIF standard指定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);

或者尝试按如下方式捕捉几种变体:

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;
        }

    }
}

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

1 个答案:

答案 0 :(得分:5)

要非常小心,格式不明确。如果一个设备返回yyyy/MM/dd而另一个设备返回yyyy/dd/MM,您可能会发现自己返回了错误的结果。

我会在try..catch块中推荐TryParseExact而不是ParseExact

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

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...