Google Takeout 导出的照片日期全不对?原因和修复方法
为什么 Google Takeout 导出的每张照片都显示成下载当天的日期,真正的拍摄时间藏在哪里,以及怎样把它写回照片。
你用 Google Takeout 把整个 Google 相册下载下来,解压,打开文件夹。十年的照片,每一张都显示成上周二拍的。按日期排序,2012 年的海边和昨天的截图挤在一起。
照片没有坏,日期也没有丢。它只是不在电脑去看的那个位置。
日期去哪了
一张照片的日期可以存在三个地方。相机会把拍摄时间写进文件内部的 EXIF 区块,字段叫 DateTimeOriginal。操作系统还在文件外面记两个时间:创建时间和修改时间。访达、文件资源管理器和大多数相册软件先读 EXIF,读不到才退回去用文件时间。
Takeout 在两处把这套机制打断了。第一,Google 把文件打包成 zip 时,文件时间变成了打包的那一刻,或者你解压的那一刻。如果 EXIF 完好,这本来无所谓。
第二,相当一部分照片的 EXIF 日期本来就缺失或者不对。截图从来没有 EXIF 日期。微信、WhatsApp 这类聊天软件压缩图片时会把元数据一并去掉。扫描的老照片记的是扫描日期,不是冲印那天。还有,如果你曾在 Google 相册里手动改过某张照片的日期,这个修改只存在 Google 的数据库里,没有写回文件。Google 导出时不把这些信息写进照片,而是在每张照片旁边放一个单独的 .json 文件。
电脑完全不理这些 .json 文件。于是它只能显示唯一能找到的日期:下载日期。
先看看有多严重
修之前,先弄清楚到底有多少文件需要修。手机相机直接拍的照片,EXIF 日期通常还在。如果你的照片大多是这种,可能只需要处理一小部分。
装了 exiftool 的话,这条命令列出所有没有 EXIF 日期的文件:
exiftool -r -if 'not $DateTimeOriginal' -filename "Takeout/Google Photos"
我们实测过一个 991 张照片的 Takeout 分卷,大约每五张里有一张,JSON 文件是正确日期的唯一来源。你的比例会不同。截图、聊天图片和老照片扫描件多的相册,对 JSON 文件的依赖要大得多。
打开一个 JSON 文件看看
每张照片都有一个配对文件,名字类似 IMG_2034.JPG.supplemental-metadata.json(较早的导出叫 IMG_2034.JPG.json)。用任何文本编辑器打开,关键的部分长这样:
"photoTakenTime": {
"timestamp": "1563102330",
"formatted": "Jul 14, 2019, 11:05:30 AM UTC"
}
这个 timestamp 就是真正的拍摄时间,以 1970 年以来的秒数记,UTC 时区。文件里还有一个 creationTime,那是照片上传到 Google 的时间。你要的是拍摄时间,所以用 photoTakenTime。整个文件的字段说明见 Google Takeout 里的 JSON 文件是什么。
手动修
只有几张照片的话,直接手动改日期。Mac 上用「预览」或「照片」打开照片调整日期。Windows 上右键文件,选「属性」,再选「详细信息」,编辑「拍摄日期」。改到第五十张,你就会想找更好的办法。
整个相册的话,大家通常用 exiftool。一条命令就能把每个 JSON 文件里的时间戳写进照片和文件时间:
exiftool -r -d %s -tagsfromfile "%d/%F.supplemental-metadata.json" \
"-DateTimeOriginal<PhotoTakenTimeTimestamp" \
"-FileCreateDate<PhotoTakenTimeTimestamp" \
"-FileModifyDate<PhotoTakenTimeTimestamp" \
-ext jpg -ext jpeg -overwrite_original "Takeout/Google Photos"
能用,但有坑。Google 会把过长的 JSON 文件名截断到 46 个字符,上面的匹配模式会漏掉这些。重名照片的 (1) 在 JSON 文件名里的位置和在照片名里不一样。视频要用另一组标签。HEIC 和 PNG 要分别再跑一遍。这些细节都在 exiftool 修复指南里。如果你习惯用终端,也有 GooglePhotosTakeoutHelper 这样的免费社区脚本替你处理命名上的怪事。
用软件
如果你不想花一个晚上在命令行上,Takeout JSON Metadata Fixer 是一个桌面软件,支持 Windows、Linux 和 Mac,界面有简体中文。
把它指向 Takeout 的 zip 文件或者解压后的文件夹。它把每张照片和对应的 JSON 文件配对,包括 2024 年起的 supplemental-metadata 命名、被截断的名字和带 (1) 的重复文件。然后把 photoTakenTime 写进照片的 EXIF,并把文件的创建时间和修改时间改成一致。没有 JSON 文件的照片,有 EXIF 日期就保留 EXIF 日期,没有就退回用文件时间,所以不会有照片变成没日期。
视频也会写入日期,写在 MP4 或 MOV 里播放器读取的位置。JSON 里有真实 GPS 坐标的,坐标也会写回照片。它还可以按真实日期给文件重命名,按年/月整理进文件夹,但这部分是可选的。只想修日期的话,选「保留文件名」和「保留我的文件夹」。
有「试运行」模式,先显示会改什么,不实际写入。前 1000 张照片免费,一次性付费 19.99 美元解除限制。所有处理都在你自己的电脑上完成,照片不会上传到任何地方。
日期一旦写进文件内部,照片以后去哪都不会再错:苹果照片、NAS、Immich、U 盘或者新手机。
常见问题
写回去的时间是哪个时区的?
JSON 里存的是 UTC 的精确时刻。工具写 EXIF 时会按你电脑的时区换算成本地时间,EXIF 默认不带时区。在北京 11:05 拍的照片,电脑设为北京时间就得到 11:05,设为纽约时间就变成前一天 22:05。修复前把电脑时区设成大多数照片的拍摄地,或者接受旅行照片差几个小时。详见照片时间差了几个小时怎么办。
写 EXIF 会损坏照片吗?
写日期标签只改元数据区块,图像像素不动。保留原始 zip 直到你对结果满意为止,这本来也是好习惯。
为什么只有一部分照片日期不对?
因为只有一部分照片本来就缺 EXIF 日期。相机照片通常有。截图、聊天图片、扫描件,还有你在 Google 相册里改过日期的照片,都得靠 JSON 文件。
修完日期之后 JSON 文件能删吗?
能。日期和 GPS 写进照片之后,JSON 文件的任务就完成了。先在新相册里抽查几张,确认无误再删。