You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解析以不同字符为日期分隔符的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:41:20