我在一个特定的应用程序中的日期/时间上度过了一段悲惨的时光。这是一个活动预订应用程序,我什至不想知道有时区这样的东西。我想要一次,而且只有一次,无论用户当前位于何处。我不希望将时间转换为任何其他区域设置/时区。此应用程序中没有"本地"时间之类的东西,因为一切都基于您预订活动的位置的时间。它需要始终在那个时间表达,而不是你目前所处的时间。因此,我真的不需要任何时区功能。
例如,您在纽约,并在 3 月 15 日晚上 10:30 在伦敦预订了活动/约会。现在,无论你是在纽约、伦敦还是世界上任何其他城市,该活动仍然在 3 月 15 日晚上 10:30 在伦敦举行。如果您在洛斯卡沃斯度假,您不想知道您的活动是在洛斯卡沃斯时间下午 3:30。
在任何人向我解释NSDate不包含时区数据之前,我完全意识到这一点,这些信息对我来说毫无用处。NSDate 可能没有时区信息,但日期被转换了数千次,每次转换都会考虑时区,这让我非常痛苦。我在 NSDate 上有大约 30 个扩展,试图确保它永远不会返回本地时间(尝试将所有内容保持在 UTC)。以为我打败了它,但显然日期选择器有自己的日期格式化器,所以所有的日期选择器现在都搞砸了。
必须有一种方法以相对简单的方式处理这个问题。我尝试将所有内容作为 UTC 日期处理,从远程数据库到 Web 服务再到 iOS 应用程序中的所有内容,确保转换为/从字符串等转换为字符串的所有内容都保持 UTC 格式。还是运气不好。我可以在几分钟内制作一个精心制作的动画,但我几周来一直在与这些愚蠢的约会作斗争。
解决这个问题的最佳方法是什么?
- 所有内容都在一个时区(例如 UTC)
- 强制应用本地时区对每个人相同?
- 将时间存储在事件位置的时区中,然后始终尝试根据该时区显示它?这听起来很复杂,但恐怕这是我应该采取的方向,即使它有点矫枉过正。
- 创建日期格式化程序并在每次触摸日期时重置区域设置?
- 其他?
事情是这样的。忽略时区,应用中的两项操作除外:
- 向用户显示日期/时间时。
- 从用户获取日期/时间时。
一旦你有了NSDate
,忘记时区的存在。按原样NSDate
保留。按原样NSDate
计算。从某种意义上说,这意味着一切都在UTC时间内完成。一切都是一致的。这一切都不复杂。
在向用户显示这些日期或从用户处获取这些日期时,您只关心时区。就是这样。
如果需要用户的区域设置时间,只需使用 NSDateFormatter
及其默认时区即可显示或获取本地时间。
如果要显示或获取特定于事件的时间,请使用时区设置为事件时区的NSDateFormatter
。
没有比这更复杂的了。
我认为这似乎总是更复杂,因为人们开始记录NSDate
并看到看起来像错误的时间,因为他们没有意识到NSLog
的输出是UTC时间,而不是本地时间。
例如,您有一个伦敦活动的UIDatePicker
。将日期选取器的时区设置为伦敦时间。存储生成的NSDate
。如果要向用户显示事件的时间,请将NSDateFormatter
的时区设置为伦敦时间。然后,无论用户身在何处,它都会显示正确的伦敦时间。