我怎样才能完全忽略整个应用程序中的时区?

How can I completely ignore time zones in entire app?

我在一个特定的应用程序中与 dates/times 度过了一段痛苦的时光。这是一个活动预订应用程序,我什至不想知道有时区这样的东西。我想要一次,而且只想要一次,无论用户当前位于何处。我不想将时间转换为任何其他时间 locale/timezone。此应用程序中没有 "local" 时间这样的东西,因为一切都基于您预订活动地点的时间。它需要始终在那个时间表达,而不是你现在所在的时间。因此,我真的不需要任何时区功能。

例如,您在纽约并预订了 3 月 15 日 10:30 下午在伦敦的 event/appointment。现在,无论您是在纽约、伦敦还是任何地方在世界其他城市,该活动仍于 3 月 15 日在伦敦 10:30 下午举行。如果您在洛斯卡沃斯度假,您不想知道您的活动是在洛斯卡沃斯时间 3:30 下午。

在有人向我解释 NSDate 不包含时区数据之前,我完全清楚这一点,而且该信息对我来说毫无用处。 NSDate 可能没有时区信息,但日期会被转换数千次,每次转换都会考虑时区,这让我很痛苦。我在 NSDate 上有大约 30 个扩展,试图确保它永远不会 returns 当地时间(尽量将所有内容都保持在 UTC)。以为我已经成功了,但显然 DatePicker 有它自己的日期格式化程序,所以现在所有的日期选择器都搞砸了。

必须有一种相对简单的方法来处理这个问题。我尝试将所有内容都作为 UTC 日期处理,从远程数据库到 Web 服务再到 iOS 应用程序中的所有内容,确保所有已转换的 to/from 字符串等都保持 UTC 格式。仍然没有太多运气。我可以在几分钟内制作出精美的动画,但我已经与这些愚蠢的日期作斗争了几个星期。

解决这个问题的最佳方法是什么?

  1. 一个时区的所有内容(例如 UTC)
  2. 是否强制每个应用的本地时区都相同?
  3. 在事件发生地点的时区存储时间,然后始终尝试根据该时区显示时间?这听起来很复杂,但恐怕这是我应该采取的方向,即使它有点过头了。
  4. 创建日期格式化程序并在我每次触摸日期时重置语言环境?
  5. 其他?

事情是这样的。忽略时区,但应用中的两个操作除外:

  1. 向用户显示 dates/times 时。
  2. 从用户处获取 dates/times 时。

一旦你有了 NSDate,忘记时区的存在。坚持NSDateas-is。使用 NSDate as-is 进行计算。从某种意义上说,这意味着一切都在 UTC 时间完成。这一切都是一致的。一切都不复杂。

您只需要在向用户显示这些日期或从用户那里获取这些日期时担心时区。就是这样。

如果您想要用户的本地时间,只需使用 NSDateFormatter 及其默认时区来显示或获取本地时间。

如果您想显示或获取特定事件的时间,请使用 NSDateFormatter 并将其时区设置为事件的时区。

没有比这更复杂的了。

我认为它总是看起来更复杂,因为人们开始记录 NSDate 并看到错误的时间,因为他们没有意识到 NSLog 的输出是 UTC 时间,而不是当地时间。

例如,您有一个 UIDatePicker 在伦敦举办的活动。将日期选择器的时区设置为伦敦时间。存储结果 NSDate。当您想向用户显示事件的时间时,请将 NSDateFormatter 的时区设置为伦敦时间。然后,无论用户身在何处,它都会显示正确的伦敦时间。