Takeout JSON

Google Takeout 导出的照片怎么恢复正确的拍摄时间?

真正的拍摄时间就在照片旁边的 .json 文件里。这里讲不用命令行也能把它写回照片的简单办法,以及手动方法的坑。

正确的日期已经在你的导出包里了。它在每张照片旁边的 .json 文件里,字段叫 photoTakenTime。问题在于没有任何看图软件会读这些文件。它们读的是 EXIF,也就是存在图片文件内部的那块信息,而 Google 把那一块留空了。

所以修复本质上是一个复制的活:从每个 .json 里读出日期,写进对应的照片,再把文件自己的时间戳改成一致。做一张要一分钟。做四万张,就得靠软件。

为什么不能直接按文件时间排

解压之后,每个文件的创建时间和修改时间都是解压那一刻。Windows 的文件资源管理器、Mac 的访达、群晖的 Synology Photos、苹果照片,全都先找 EXIF 里的拍摄时间,找不到才用文件时间。相机拍的照片 EXIF 通常还在,所以看起来一部分照片是对的。截图、微信里保存的图片、扫描件,还有你在 Google 相册里手动改过日期的照片,EXIF 里没有日期,于是全部堆到解压那天。

修好的标志是:EXIF 里有拍摄时间,文件时间和它一致。这样不管照片以后去哪,日期都跟着走。

手动做的三个坑

可以自己写一条 exiftool 命令,很多人也是这么做的。但附属文件的命名让这件事变得麻烦:

第一,Google 会把过长的文件名截断到 46 个字符,所以 PXL_20240311_183022711.jpg 的附属文件叫 PXL_20240311_183022711.jpg.supplemental-m.json,固定后缀匹配不到。

第二,2024 年前后的导出用两种不同的命名方式,IMG_2034.JPG.jsonIMG_2034.JPG.supplemental-metadata.json,一个模式只能匹配一种。

第三,重名照片的 (1) 序号在附属文件里的位置很怪:照片叫 IMG_2034(1).JPG,附属文件却叫 IMG_2034.JPG.supplemental-metadata(1).json

一个匹配模式漏掉这些,就会悄无声息地跳过文件,你要到几个月后才发现某一批照片还是错的。细节都在 supplemental-metadata.json 详解exiftool 修复指南里。

用软件做

Takeout JSON Metadata Fixer 替你处理上面所有情况。选择 Takeout 文件夹或 zip 文件,选择修好的照片放在哪,点开始。它把每个附属文件和对应的照片配对,写入日期、时间和 GPS,结束时告诉你哪些文件没有可用的数据。没有附属文件的照片保留原有的 EXIF 日期,两者都没有的用文件时间,所以不会有照片变成「无日期」。

顺带可以做的事:按拍摄时间和地点重命名,比如 2019-07-14-1105_Shanghai.jpg;按年/月或按拍摄地点分文件夹;HEIC 转 JPG 并保留元数据。这些都是可选项,只想修日期的话,选「保留文件名」和「保留我的文件夹」。

先跑一遍试运行,看看它打算改什么。全部在你的电脑上完成,不上传,不需要账号,断网也能用。界面有简体中文。Windows、Linux 和 Mac 都支持。前 1000 张照片免费,之后一次性 19.99 美元。

修之前先做两件事

把所有 Takeout 分卷解压到同一个文件夹。照片和它的附属文件经常分在不同的 zip 分卷里,分开解压就配不上对。

检查电脑的时区。附属文件里的时间戳是 UTC,写 EXIF 时会按电脑的时区换算。你在国内拍的照片,电脑设成北京时间(UTC+8)才会得到正确的本地时间。如果你人在国外、大部分照片也是在国外拍的,就设成那边的时区。详见照片时间差了几个小时怎么办

修完怎么验证

从不同年份挑十张照片:一张截图、一张微信保存的图、一段视频、一张你记得在 Google 相册里改过日期的照片。在新的相册软件或文件资源管理器里找到它们,看「拍摄日期」是不是和 Google 相册里显示的一样。都对了,再删附属文件和原始 zip。

常见问题

只想修日期,不想改文件名和文件夹,行吗?

行。选「保留文件名」和「保留我的文件夹」,软件只写 EXIF 和文件时间,其他不动。

视频也能修吗?

能。MP4 和 MOV 不用 EXIF,日期存在视频容器的另一组标签里,软件会写到播放器读取的位置。

修完能再传回 Google 相册吗?

能,而且日期是对的。Google 相册上传时读文件里的 EXIF,不读附属文件。这也是为什么先修文件再传,比直接把导出包传到另一个账号靠谱。