Takeout JSON

Takeout 照片的时间为什么差了几个小时?时区的问题

Google Takeout 导出后照片时间整体差三五个小时甚至跨了一天,几乎总是时区换算,不是数据坏了。讲原因和怎样一次修对。

整体差几个小时,是时区问题的标志。数据损坏看起来是一团乱码。整个相册干干净净地差三、五或八个小时,是算术。

为什么会差

Google 把一张照片的拍摄时刻记成一个 UTC 时间戳。打开任何一个附属文件,photoTakenTime 里是一串数字,比如 1689929130,那是从 1970 年 1 月 1 日起的秒数,按 UTC 计。它精确地钉住了一个时刻,但不说你按快门时是在北京还是在洛杉矶。

EXIF 正好反过来。它存的是不带时区的挂钟时间,2023:07:21 09:25:30,就这样,没有时区。

两者之间换算,必须选一个时区,而任何工具都会用你电脑当前设置的那个。这通常是对的,因为大多数人的照片大多在家附近拍。出问题的是这几种情况:

  • 你搬了国家,电脑时区改了,但大部分照片是搬家前拍的。
  • 电脑或服务器设成了 UTC,很多 NAS 和 Linux 机器默认是这样。
  • 照片是旅行时在别的时区拍的。

每张照片都差同样的量,这就是为什么规律这么一致。

用北京时间算一遍

假设照片在国内拍,北京时间是 UTC+8。晚上 8 点拍的一张照片,附属文件里存的是 UTC 12:00。

电脑设成北京时间,写进 EXIF 的是 20:00,对。

电脑设成 UTC,写进 EXIF 的是 12:00,差 8 小时。而早上 8 点之前拍的所有照片,会跑到前一天:早上 7 点的早餐照片,变成前一天晚上 23:00。这就是人们真正会注意到的版本,某一天的照片跑到了另一天。

电脑设成美国东部时间,差 12 或 13 个小时,半天的照片都跨了日期。

反过来也一样。人在国外,电脑设成当地时间,回国探亲那两周拍的照片,全部差几个小时。

先修原因,再修照片

在跑任何修复工具之前,把电脑的时区设成大多数照片的拍摄地。Windows 在「设置」,「时间和语言」,「日期和时间」里改。Mac 在「系统设置」,「通用」,「日期与时间」里改。用 exiftool 的话,也可以只对这一条命令设:

TZ=Asia/Shanghai exiftool ...

然后对整个导出跑一次。同样的换算作用于每个文件,你得到的是一个整体一致的相册,而不是一个要永远抽查的相册。

已经修过、发现差了几个小时的,把时区改对,用原始 zip 或 Takeout 文件夹重新跑一遍。这就是 zip 要多留一阵的原因之一。

旅行照片没有完美答案

附属文件里只有 UTC 时刻,没有拍摄地的时区。在东京早上 9 点拍的照片,电脑设成北京时间,写出来是早上 8 点,差一个小时;设成伦敦时间,写出来是凌晨 1 点。单靠附属文件没有办法知道这张照片该用哪个时区。

唯一记录了当地时间的,是相机自己写的 EXIF,如果它还在的话。所以不要「修」那些已经有正确 EXIF 日期的照片。工具应该只给缺日期的照片写日期,让完好的保持原样。有 GPS 的照片理论上可以按坐标推时区,但那是另一件事。

大多数人的做法是:时区设成家,接受旅行照片差几个小时。日期几乎总还是对的,一天里的顺序也对。

Takeout JSON Metadata Fixer 按电脑的时区把每个时间戳做同样的换算,一次运行同时写 EXIF 日期和文件时间,所以两者一致。没有附属文件的照片保留原有的 EXIF 日期。前 1000 张照片免费,先处理一个你记得清楚的文件夹,核对时间再处理全部。Windows、Linux 和 Mac,界面有简体中文,离线运行。

常见问题

差 8 小时是怎么回事?

电脑设成了 UTC,而照片在国内(UTC+8)拍的。把时区改成北京时间重新跑。

只有一部分照片差几个小时,为什么?

说明你用的工具只给缺 EXIF 日期的照片写了日期,比如 exiftool 加了 -if 'not $DateTimeOriginal'。差的那部分是靠附属文件写日期的照片:截图、微信图片、扫描件,和你在 Google 相册里改过日期的。没差的那部分保留了相机写的 EXIF,也就是相机记的当地时间。

视频也一样吗?

MP4 和 MOV 的日期标签本身就按 UTC 存,播放器再按本地时区显示。写的时候按 UTC 写就对,软件和 exiftool 的 -api QuickTimeUTC 都是这么做的。

能给 EXIF 加上时区吗?

新的 EXIF 有 OffsetTimeOriginal 标签,新手机会写。老照片没有,大多数相册软件也只看不带时区的那个时间。把电脑时区设对,比事后补时区标签省事。