PHAsset creationDate 使用什么时区?
What Time Zone is used by PHAsset creationDate?
PHAsset creationDate returns 一个 NSDate,其构造就好像所有照片都是在相同的 "home" 时区拍摄的。例如,在给定的 iPhone 上,一张下午 4 点在纽约拍摄的照片与一张下午 4 点在加利福尼亚拍摄的照片具有相同的创建日期。这很方便:只要你显示 "home" Time Zone 中的日期,它就会显示拍摄照片的当地时间,这通常是你想要看到的。如果 PHAsset 返回一个 UTC creationDate,那么您需要知道它被捕获的时区,iPhone 甚至可能不知道,而用户无论如何都想看到的本地捕获时间很可能可用于任何照片。因此,Photos 框架只是使用一些固定的时区将该本地时间反向编码为 NSDate。
有谁知道如何确定照片框架为此使用的时区?更改 iPhone 设置 ([NSTimeZone systemTimeZone]) 似乎不会影响它,即使在系统重新启动后也是如此。有没有更稳定的系统Time Zone?或者,这是照片框架正在保存的东西吗?
我知道一种确定方法,即读取照片元数据以获取照片拍摄时的当地时间。然后将其与 PHAsset creationDate 进行比较以查看使用的偏移量。但是,如果有合法的方法来查询此参数,那将是非常难看的。或者,更重要的是,了解它可能会在什么条件下发生变化。
下面是一张在澳大利亚 (GMT+10) 拍摄的照片在加利福尼亚州 (GMT-7) 上打开的示例 iPhone:
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 与实际创建日期不匹配。相反,它是对应于加利福尼亚时区 15:57:35 的 UTC 时间。这是照片中的元数据子集
{
"{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";
};
}
没有常量 "home" timeZone,正如我在检查 phone 上的 PHAsset 行为时所猜测的那样。首次保存照片时,将根据 iPhone 的当前时区和创建照片的当地时间(如果未由 iPhone 相机拍摄,则来自 jpeg 元数据)估算 UTC creationDate ).因此,没有常量 "home" timeZone,而是根据照片保存时间的不同而不同。只要照片是在第一次保存到 iPhone 的同一时区拍摄的,那么创建日期就是正确的。
我看到的行为只是因为我在不同时区拍摄的所有照片都是在较旧的 iPhone 上拍摄并延续到这一张。我看到的恒定 "home" 时区只是发生该传输时的当前时区。这对正确显示当地时间有很好的副作用,所以我假设这是设计使然,适用于在不同时区拍摄的所有照片。
PHAsset creationDate returns 一个 NSDate,其构造就好像所有照片都是在相同的 "home" 时区拍摄的。例如,在给定的 iPhone 上,一张下午 4 点在纽约拍摄的照片与一张下午 4 点在加利福尼亚拍摄的照片具有相同的创建日期。这很方便:只要你显示 "home" Time Zone 中的日期,它就会显示拍摄照片的当地时间,这通常是你想要看到的。如果 PHAsset 返回一个 UTC creationDate,那么您需要知道它被捕获的时区,iPhone 甚至可能不知道,而用户无论如何都想看到的本地捕获时间很可能可用于任何照片。因此,Photos 框架只是使用一些固定的时区将该本地时间反向编码为 NSDate。
有谁知道如何确定照片框架为此使用的时区?更改 iPhone 设置 ([NSTimeZone systemTimeZone]) 似乎不会影响它,即使在系统重新启动后也是如此。有没有更稳定的系统Time Zone?或者,这是照片框架正在保存的东西吗?
我知道一种确定方法,即读取照片元数据以获取照片拍摄时的当地时间。然后将其与 PHAsset creationDate 进行比较以查看使用的偏移量。但是,如果有合法的方法来查询此参数,那将是非常难看的。或者,更重要的是,了解它可能会在什么条件下发生变化。
下面是一张在澳大利亚 (GMT+10) 拍摄的照片在加利福尼亚州 (GMT-7) 上打开的示例 iPhone:
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 与实际创建日期不匹配。相反,它是对应于加利福尼亚时区 15:57:35 的 UTC 时间。这是照片中的元数据子集
{
"{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";
};
}
没有常量 "home" timeZone,正如我在检查 phone 上的 PHAsset 行为时所猜测的那样。首次保存照片时,将根据 iPhone 的当前时区和创建照片的当地时间(如果未由 iPhone 相机拍摄,则来自 jpeg 元数据)估算 UTC creationDate ).因此,没有常量 "home" timeZone,而是根据照片保存时间的不同而不同。只要照片是在第一次保存到 iPhone 的同一时区拍摄的,那么创建日期就是正确的。
我看到的行为只是因为我在不同时区拍摄的所有照片都是在较旧的 iPhone 上拍摄并延续到这一张。我看到的恒定 "home" 时区只是发生该传输时的当前时区。这对正确显示当地时间有很好的副作用,所以我假设这是设计使然,适用于在不同时区拍摄的所有照片。