如何判断PHAsset的CreationDate是否为UTC并正确转换时区?
PHAsset 日期相关问题解答
1. 如何区分PHAsset的CreationDate是否为时区感知的?
PHAsset的creationDate本身是时区无关的UTC时间戳,判断它是否对应时区感知的拍摄时间,核心要看照片的原始元数据:
- 通过
PHAsset.requestContentEditingInput或PHAsset.requestAssetMetadata接口获取照片的EXIF元数据 - 检查元数据中是否存在
OffsetTimeOriginal或OffsetTimeDigitized字段,这两个字段记录了拍摄时间相对于UTC的偏移量 - 若存在上述偏移字段,说明原始拍摄时间是时区感知的,
creationDate是基于该带时区时间转换而来的UTC时间;若没有这些偏移字段,仅靠creationDate无法确定拍摄时的当地时区
2. 无地理位置时如何转换为拍摄当地时间?
没有地理位置和明确时区信息的情况下,不存在100%准确的转换方式,可按以下优先级处理:
- 优先读取EXIF原始时间:直接取EXIF中的
DateTimeOriginal或DateTimeDigitized字段,很多相机会直接记录拍摄时的本地时间(而非UTC),可直接作为当地时间使用 - 设备时区兜底:如果没有EXIF原始时间,只能将
creationDate(UTC)转换为当前设备的时区时间,但这只是近似值,可能和实际拍摄时间不符 - 用户手动确认:最可靠的方式是提供交互让用户选择拍摄时的时区,避免自动转换的误差
3. iOS和Mac的Photos App显示日期的逻辑是什么?
Photos App的日期显示优先级和判断逻辑如下:
- 第一优先级:使用EXIF中的
DateTimeOriginal(拍摄原始时间),如果存在对应的OffsetTimeOriginal时区偏移,会将该时间转换为用户设备当前时区显示;如果没有偏移,直接将DateTimeOriginal当作本地时间显示 - 第二优先级:如果没有
DateTimeOriginal,则使用DateTimeDigitized(照片数字化时间),逻辑和上述一致 - 第三优先级:如果以上EXIF字段都不存在,才会使用PHAsset的
creationDate(UTC时间),并转换为设备当前时区显示 - 补充:如果照片带有地理位置,Photos会通过地理位置反推对应的时区,用这个时区校正拍摄时间,确保显示的是当地拍摄时间
内容的提问来源于stack exchange,提问作者Michal.Jan008
相关产品推荐
相关产品推荐

