如何解析以不同字符为日期分隔符的EXIF日期时间字符串?
解析佳能设备EXIF中的多格式日期时间字符串
嘿,我太懂你这个困扰了——佳能设备的EXIF日期时间格式真的有点“任性”,一会儿用冒号分隔日期,一会儿换成连字符,甚至偶尔还会出现其他奇怪的分隔符,手动适配简直头疼。结合近几年C#的特性,我给你几个实用的解决方案:
方案一:多格式直接匹配解析
C#的DateTime.TryParseExact支持传入多个格式字符串,能一次性覆盖佳能常见的几种日期格式,这是最直接省心的方式。比如佳能设备常出现的格式包括:
yyyy:MM:dd HH:mm:ss(标准EXIF格式,冒号分隔日期)yyyy-MM-dd HH:mm:ss(部分扫描设备偏好连字符)yyyy/MM/dd HH:mm:ss(少数旧型号会用斜杠)yyyy:MM:dd HH:mm:ss.fff(带毫秒的情况)
代码示例:
using System.Globalization; string[] canonDateTimeFormats = { "yyyy:MM:dd HH:mm:ss", "yyyy-MM-dd HH:mm:ss", "yyyy/MM/dd HH:mm:ss", "yyyy:MM:dd HH:mm:ss.fff" }; string exifDateTime = "2024:05:20 14:30:45.123"; // 示例EXIF时间字符串 if (DateTime.TryParseExact( exifDateTime, canonDateTimeFormats, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime parsedTime)) { // 解析成功,parsedTime就是标准化的DateTime对象 Console.WriteLine($"解析完成:{parsedTime:yyyy-MM-dd HH:mm:ss.fff}"); } else { // 处理解析失败的边界情况 Console.WriteLine("无法识别该日期时间格式"); }
方案二:正则统一分隔符后解析
如果遇到更奇葩的混合分隔符(比如2024-05 20 14:30:45这种极端情况),可以先用正则把日期部分的非数字分隔符统一替换成标准符号,再用单一格式解析:
代码示例:
using System.Text.RegularExpressions; using System.Globalization; string messyExifString = "2024/05-20 14:30:45"; // 混合分隔符示例 // 正则替换:将日期段的非数字字符统一换成冒号 string normalizedString = Regex.Replace(messyExifString, @"(\d{4})[^\d]+(\d{2})[^\d]+(\d{2})", "$1:$2:$3"); if (DateTime.TryParseExact( normalizedString, "yyyy:MM:dd HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime parsedTime)) { Console.WriteLine($"解析完成:{parsedTime:yyyy-MM-dd HH:mm:ss}"); }
方案三:用专业EXIF库简化处理
如果不想自己折腾解析逻辑,直接用专门的EXIF处理库(比如NuGet上的ExifLib),它已经内置了对各厂商EXIF格式的兼容处理,直接读取对应属性即可:
代码示例:
using ExifLib; using (ExifReader reader = new ExifReader("your-photo-file.jpg")) { if (reader.GetTagValue(ExifTags.DateTimeOriginal, out DateTime shootTime)) { Console.WriteLine($"照片拍摄时间:{shootTime:yyyy-MM-dd HH:mm:ss}"); } }
这个方案的优势是不用关心底层格式差异,库已经帮你搞定了所有厂商的“特殊习惯”。
小提醒
- 记得引用
System.Globalization命名空间,不然CultureInfo.InvariantCulture会报错 - 如果需要处理带时区的EXIF时间,解析时可以加上
DateTimeStyles.AdjustToUniversal参数
内容的提问来源于stack exchange,提问作者Cyberherbalist
相关产品推荐
相关产品推荐

