Takeout JSON

구글 포토에서 내려받은 사진 시간이 9시간 차이 나는 이유

테이크아웃 사진의 촬영 시각이 9시간 어긋나거나 날짜가 하루 바뀌는 이유는 UTC와 한국 표준시의 차이입니다. 원인과 고치기 전에 확인할 설정을 설명합니다.

테이크아웃으로 받은 사진의 날짜는 맞는데 시각이 이상합니다. 오후 3시에 찍은 사진이 오전 6시로 나옵니다. 저녁 사진 일부는 아예 전날 날짜입니다. 차이를 계산해 보면 정확히 9시간입니다.

9시간은 한국 표준시와 UTC의 차이입니다. 어딘가에서 시간대 변환이 빠졌거나 두 번 된 것입니다.

사이드카의 시각은 UTC

테이크아웃의 .json 사이드카를 열면 photoTakenTime1689929130 같은 숫자가 있습니다. 1970년 1월 1일 UTC 자정부터 센 초입니다. 정확한 순간을 못 박지만 불완전합니다. 셔터를 누를 때 서울에 있었는지 로스앤젤레스에 있었는지는 말해 주지 않습니다. 옆의 formatted 항목도 Jul 21, 2023, 9:25:30 AM UTC처럼 UTC로 적혀 있습니다.

EXIF는 반대로 동작합니다. 2023:07:21 18:25:30처럼 시간대 없는 현지 벽시계 시각을 저장합니다. 둘 사이를 변환하려면 시간대를 하나 골라야 하고, 어떤 도구를 쓰든 컴퓨터의 시간대를 고릅니다.

한국에서 찍은 사진이고 컴퓨터가 "(UTC+09:00) 서울"로 설정되어 있으면 UTC 09:25가 18:25로 바뀌어 맞게 들어갑니다. 컴퓨터가 UTC나 다른 시간대로 되어 있으면 그만큼 어긋납니다. 9시간 차이는 대개 컴퓨터가 UTC로 설정되어 있거나, 도구가 변환을 건너뛰고 UTC 값을 그대로 쓴 경우입니다.

9시간 차이가 생기는 흔한 경우

컴퓨터의 시간대가 틀림. 해외에서 쓰던 노트북, 중고 PC, 클라우드 가상 머신, 도커 컨테이너는 UTC로 설정된 경우가 많습니다. 리눅스 서버에서 exiftool을 돌렸다면 거의 확실히 이 경우입니다.

도구가 UTC를 그대로 씀. formatted 문자열을 파싱해서 시간대 표시를 무시하고 EXIF에 넣는 스크립트가 있습니다. 결과는 한국 사진 전부가 9시간 이릅니다.

동영상의 이중 변환. MP4와 MOV는 컨테이너 안의 날짜를 UTC로 저장하는 것이 규격입니다. 일부 재생 프로그램은 이것을 현지 시각으로 바꿔 보여 주고 일부는 그대로 보여 줍니다. 사진은 맞는데 동영상만 9시간 틀리다면 이 경우입니다. exiftool로 동영상에 쓸 때는 -api QuickTimeUTC 옵션이 이 차이를 처리합니다.

날짜가 하루 바뀜. 자정부터 오전 9시 사이에 찍은 사진은 UTC로는 전날입니다. 시각이 9시간 어긋나면 이 사진들은 날짜까지 하루 앞으로 갑니다. 새벽 사진과 밤 사진이 다른 날 폴더에 들어가면 이것을 의심하십시오.

어긋난 것이 시간대인지 확인하는 방법

틀린 사진 하나를 골라 옆의 .json을 열고 formatted 값을 봅니다. 그 UTC 시각에 9를 더한 것이 실제 촬영 시각이어야 합니다. 탐색기 속성의 "찍은 날짜"가 formatted와 똑같다면 변환이 빠진 것이고, 9시간이 아니라 8시간이나 10시간 차이라면 컴퓨터가 다른 시간대로 설정되어 있는 것입니다. 차이가 사진마다 제각각이라면 시간대 문제가 아니라 짝이 잘못 맞춰진 사이드카를 의심해야 합니다.

고치기 전에 할 일

날짜를 사진에 쓰기 전에 컴퓨터의 시간대를 확인하십시오. 윈도우는 설정, 시간 및 언어, 날짜 및 시간에서 "(UTC+09:00) 서울"인지 봅니다. 맥은 시스템 설정의 날짜와 시간입니다. 리눅스 터미널은 timedatectl로 확인하고, exiftool 명령 앞에 TZ=Asia/Seoul을 붙이면 그 실행에만 시간대를 지정할 수 있습니다.

TZ=Asia/Seoul exiftool -r -d %s -tagsfromfile "%d/%F.supplemental-metadata.json" \
  "-DateTimeOriginal<PhotoTakenTimeTimestamp" -ext jpg -ext heic -overwrite_original .

이미 EXIF 촬영일이 있는 사진은 건드리지 마십시오. 카메라가 쓴 EXIF는 촬영 당시의 현지 시각이라 이미 맞습니다. -if 'not $DateTimeOriginal'을 붙이면 그런 사진은 그대로 둡니다. 전체 명령은 exiftool 안내에 있습니다.

Takeout JSON Metadata Fixer는 모든 타임스탬프를 컴퓨터의 시간대로 일관되게 변환해서 EXIF 날짜와 파일 날짜를 한 번에 씁니다. 동영상은 MP4나 MOV 안에서 재생 프로그램이 읽는 자리에 날짜를 씁니다. 컴퓨터 시간대만 맞게 두면 라이브러리 전체가 같은 기준으로 정리됩니다. 윈도우, 맥, 리눅스에서 오프라인으로 동작하고 인터페이스는 한국어입니다. 1000장까지 무료입니다.

해외 여행 사진은 어쩔 수 없나

컴퓨터가 서울 시간이면 도쿄에서 찍은 사진은 맞고(같은 시간대), 파리에서 오전 9시에 찍은 사진은 오후 4시나 5시로 나옵니다. 사이드카에는 촬영 당시의 시간대가 없어서 이것은 사이드카만으로는 고칠 수 없습니다. 유일한 기록은 카메라가 쓴 EXIF이고, 그것이 살아 있는 사진은 이미 맞습니다. 사이드카에만 의존하는 여행 사진은 몇 시간 어긋나는 것을 감수하거나, 여행 폴더만 따로 골라 해당 시간대로 다시 처리해야 합니다.

날짜 단위로만 정리한다면 대부분의 여행 사진은 그래도 맞는 날에 들어갑니다. 파리에서 밤 10시 이후에 찍은 사진만 다음 날로 넘어갑니다.

이미 9시간 틀리게 써 버렸다면

exiftool로 전체를 9시간 옮길 수 있습니다. 시각이 9시간 이르다면 더하고, 늦다면 뺍니다.

exiftool "-AllDates+=0:0:0 9:0:0" -overwrite_original .

이 명령은 폴더 안 모든 사진의 EXIF 날짜 세 개를 9시간 뒤로 옮깁니다. 원래 맞던 카메라 사진까지 같이 옮겨 버리므로, 틀린 사진만 있는 폴더에서만 쓰십시오. 확실하지 않으면 원본 zip에서 다시 시작하는 것이 안전합니다.

정리

시간대 문제는 원인이 하나입니다. UTC 값을 현지 시각으로 바꾸는 단계에서 컴퓨터의 시간대가 쓰인다는 것입니다. 쓰기 전에 시간대를 맞추면 나머지는 자동으로 맞습니다. 이미 써 버렸다면 원본 zip에서 다시 하는 것이 가장 확실합니다.

자주 묻는 질문

구글 포토 웹에서는 시간이 맞았는데요?

구글 포토는 업로드한 휴대폰의 시간대를 알고 있어서 그것으로 보여 줍니다. 내보낼 때 그 시간대는 사이드카에 들어가지 않고 UTC 값만 나옵니다.

삼성 갤러리에서만 9시간 틀립니다.

갤러리는 파일 안의 EXIF 촬영일을 읽습니다. EXIF가 UTC 값으로 쓰여 있으면 갤러리도 그대로 보여 줍니다. PC의 시간대를 맞추고 다시 쓰는 것이 해결입니다.

EXIF에 시간대를 넣을 수는 없나요?

OffsetTimeOriginal이라는 태그가 있어서 +09:00 같은 값을 넣을 수 있습니다. 최근 휴대폰은 이 값을 씁니다. 다만 모든 사진 앱이 읽는 것은 아니라서, 현지 시각 자체를 맞게 쓰는 것이 우선입니다.