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

iOS保存JPG时24小时制开关影响Photos日期显示问题咨询

问题定性

这是iOS Photos框架存在多年的已知Bug,既不是官方设计规范,也不是你的代码写错了。

这个Bug的触发逻辑和你观察到的完全一致:

  • 系统关闭24小时制(使用12小时时间显示)时,creationRequestForAssetFromImage(atFileURL:) 接口会正常解析JPG内EXIF存储的原始拍摄时间,Photos App展示的就是EXIF记录的时间。
  • 系统开启24小时制时,接口内部解析EXIF时间的逻辑会出现格式匹配错误,读不到EXIF里的时间字段,就会默认把文件写入相册的时间作为照片创建时间,也就是你看到的实际保存时间。

问题根源是苹果内部实现EXIF时间解析的时候,没有强制用EXIF标准规定的yyyy:MM:dd HH:mm:ss固定格式做匹配,错误地关联了系统12/24小时制的显示设置,导致格式匹配失败。这个问题从iOS 10版本开始就有开发者提交过Feedback,到近年的iOS版本也没有完全修复,苹果也没有在公开文档中说明过这个逻辑。

临时规避方法

不要依赖系统自动解析EXIF时间,手动读取JPG里的EXIF原始时间,显式赋值给PHAsset的creationDate字段就能绕开这个Bug,参考实现:

PHPhotoLibrary.shared().performChanges({
    guard let imageData = try? Data(contentsOf: jpgFileUrl),
          let imageSource = CGImageSourceCreateWithData(imageData as CFData, nil),
          let properties = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, nil) as? [CFString: Any],
          let exifInfo = properties[kCGImagePropertyExifDictionary] as? [CFString: Any],
          let dateStr = exifInfo[kCGImagePropertyExifDateTimeOriginal] as? String else {
        PHAssetChangeRequest.creationRequestForAssetFromImage(atFileURL: jpgFileUrl)
        return
    }

    let formatter = DateFormatter()
    // 强制用EXIF标准格式解析,不受系统时间设置影响
    formatter.dateFormat = "yyyy:MM:dd HH:mm:ss"
    formatter.locale = Locale(identifier: "en_US_POSIX")
    guard let originalDate = formatter.date(from: dateStr) else {
        PHAssetChangeRequest.creationRequestForAssetFromImage(atFileURL: jpgFileUrl)
        return
    }

    let request = PHAssetChangeRequest.creationRequestForAssetFromImage(atFileURL: jpgFileUrl)
    request?.creationDate = originalDate
}, completionHandler: { success, error in
    print("success=\(success), error=\(String(describing: error))")
})

不同24小时制设置下的照片时间显示差异

内容的提问来源于stack exchange,提问作者M.Masa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 23:42:28