【问题标题】:What Time Zone is used by PHAsset creationDate?PHAsset creationDate 使用什么时区?
【发布时间】:2017-01-18 17:31:42
【问题描述】:

PHAsset creationDate 返回一个 NSDate,它的构造就像所有照片都是在同一个“家庭”时区拍摄的。例如,在给定的 iPhone 上,纽约下午 4 点拍摄的照片与加利福尼亚下午 4 点拍摄的照片具有相同的创建日期。这很方便:只要你在“家乡”时区显示日期,它就会显示拍摄照片的当地时间,这通常是你想要看到的。如果 PHAsset 返回 UTC creationDate,那么您将需要知道它是在哪个时区捕获的,iPhone 甚至可能不知道,而用户想要查看的本地捕获时间很可能是可用的任何照片。因此,Photos 框架只是将本地时间反向编码为 NSDate,使用一些固定的时区。

有谁知道如何确定照片框架为此使用的时区?即使在系统重新启动后,更改 iPhone 设置 ([NSTimeZone systemTimeZone]) 似乎也不会影响它。有没有更稳定的系统时区?或者,这是照片框架正在保存的东西吗?

我知道一种可以确定它的方法,即读取照片元数据以获取拍摄照片的当地时间。然后将其与 PHAsset creationDate 进行比较以查看使用的偏移量。但是,如果有一种合法的方式来查询这个参数,那就太难看了。或者,更重要的是,要知道在什么条件下它可能会发生变化。

以下是在基于加利福尼亚 (GMT-7) 的 iPhone 上打开在澳大利亚 (GMT+10) 拍摄的照片的示例: PHAsset creationDate: 2015-03-09 22:57:35 +0000 Actual UTC capture date: 2015:03:09 05:57:34 +0000 Australian capture date: 2015:03:09 15:57:35 (GMT+10)

请注意 PHAsset creationDate 与实际创建日期不匹配。而是 UTC 时间对应于加利福尼亚时区的 15:57:35。这是照片中元数据的子集

{ "{Exif}" = { DateTimeDigitized = "2015:03:09 15:57:35"; }; "{GPS}" = { DateStamp = "2015:03:09"; TimeStamp = "05:57:34"; }; "{TIFF}" = { DateTime = "2015:03:09 15:57:35"; }; }

【问题讨论】:

  • 我发现您最初的假设不太可能。下午 4 点在纽约拍摄的照片的 creationDate 可能与下午 1 点在加利福尼亚拍摄的照片的 creationDate 相同。 NSDate 没有时区。这是一个固定的时间点。
  • 看看一些 PHAsset 并亲自看看。如果它按照您的建议工作,那么应用程序需要知道照片拍摄的时区,以便显示照片的拍摄时间。此外,除非元数据包含位置或时区信息,否则 iOS 将无法将本地时间转换为任何其他时间。所以,基本上它只是返回拍摄照片的当地时间,标准化为固定时区。
  • 不,拍照时,当前NSDate设置为creationDate。不需要时区信息。如果我记录该日期,无论我在哪个时区,它都是正确的。您似乎对NSDate 及其代表的含义有一个基本的误解。如果两个不同时区的两个人在完全相同的物理时间(不是时钟时间,而是实际时间)拍摄照片,那么这两个资产将具有完全相同的创建日期值。但是,当在用户的当前时区查看这些值中的每一个时,他们都会看到该日期的相应本地时间。
  • 不,它实际上并不是这样工作的。如果用户正在查看日落的照片,他们希望它在“晚上 7 点”左右,而不管它是在哪个时区拍摄的。所以相机通常只是将当地时间写入 jpeg 元数据。当然,iOS 也知道您的位置和时区,因此实际上它确实将 GMT 时间与 GPS 元数据一起写入。但是,EXIF 和 TIFF 元数据是本地时间(没有任何时区信息)。而且无论 GPS GMT 时间是否可用,PHAsset.creationTime 都不会返回它(除非照片是在参考 TZ 中拍摄的)。
  • 你完全错了。我看过了。对于在您的“家庭”时区拍摄的照片,PHAsset.creationDate 是创建照片的 UTC 时间。对于在其他时区拍摄的照片,它进行了调整,以便如果您在“家庭”时区显示它,它会显示拍摄照片的当地时间,这是用户想要看到的。位置或时区数据并不总是可用,但用户几乎总是想知道他们拍摄照片的时间和地点。

标签: ios nsdate nstimezone photosframework


【解决方案1】:

正如我通过检查手机上的 PHAsset 行为所猜测的那样,没有固定的“家”时区。首次保存照片时,UTC creationDate 将根据 iPhone 的当前时区和创建照片的本地时间(如果 iPhone 相机未捕获则来自 jpeg 元数据)进行估算。因此,没有固定的“家”时区,而是根据照片的保存时间不同而不同。只要照片是在第一次保存到 iPhone 的同一 timeZone 中拍摄的,那么 creationDate 就是正确的。

我看到的这种行为只是因为我在不同时区拍摄的所有照片都是在旧款 iPhone 上拍摄的,并被转移到这台 iPhone 上。我看到的恒定“家乡”时区只是发生转移时的当前时区。这对正确显示当地时间有很好的副作用,所以我认为这是为在不同时区拍摄的所有照片设计的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    • 2021-03-19
    • 2011-09-19
    相关资源
    最近更新 更多