注意 - 是的,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;
}
}
}
不要让我开始使用可能的所有其他格式!
答案 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...