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)
不要让我开始使用可能发生的所有其他格式!
对模糊格式要非常小心.如果一个设备返回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)