Puede que dependa de la cámara/teléfono y del sistema operativo; pero, no creo que la zona horaria se almacene explícitamente en los metadatos EXIF de la imagen.
En algunos metadatos, hay una GPS Time (Atomic Clock)
que se fija en UTC. Así que, Fotos probablemente sólo calcula las compensaciones de Date and Time (Original)
para mostrar la zona horaria.
Es posible que pueda utilizar la exiftool para elaborar una lista de esas dos veces para sus fotos, y buscar valores atípicos que sean más (o menos) diferentes de los otros.
Actualización del cartel original:
Junté una pitón rápida script para comparar estos tiempos, e imprimir los que no están en la zona horaria esperada, o tienen valores diferentes para los minutos. Tendrás que exportar los originales sin modificar de Photos, ya que los modificados no tienen estos metadatos, y luego pasar sus nombres de archivo a este script.
Por supuesto, no tengo ni idea de si esto se acerca a lo que hace Fotos para fijar la zona horaria. Pero identificó correctamente las fotos que conocía con la zona horaria equivocada, y no encontró ningún falso positivo.
#!/usr/bin/python
from subprocess import check_output
import sys, re, os
from dateutil.parser import parse
from datetime import datetime
expected_offset_hours = 8.0 # set to appropriate time zone offset
def get_field(out, name):
match = re.search("^" + re.escape(name) + "\t(.+?)$", out, re.MULTILINE)
if match:
return match.group(1)
return None
for arg in sys.argv[1:]:
if not os.path.exists(arg):
continue
out = check_output(["exif", "-m", arg])
gps_date = get_field(out, "GPS Date")
gps_time = get_field(out, "GPS Time (Atomic Clock)")
if gps_date == None or gps_time == None:
print arg + "\tNo GPS date/time"
continue
gps_parsed = datetime.strptime(gps_date + " " + gps_time, '%Y:%m:%d %H:%M:%S.%f')
orig_datetime = get_field(out, "Date and Time (Original)")
if orig_datetime == None:
continue
orig_parsed = datetime.strptime(orig_datetime, '%Y:%m:%d %H:%M:%S')
offset_secs = (orig_parsed - gps_parsed).total_seconds()
offset_hours = round(offset_secs / 3600)
offset_mins = abs(offset_secs - (offset_hours * 3600)) // 60
if offset_hours != expected_offset_hours or offset_mins > 0:
#print gps_date + ' ' + gps_time + ' ' + str(gps_parsed)
#print orig_datetime + ' ' + str(orig_parsed)
print arg + "\t" + str(offset_hours) + "\t" + str(offset_mins)