如何完全忽略整个应用中的时区?

时间:2016-01-19 22:54:29

标签: ios swift datepicker timezone nsdateformatter

我在一个特定应用中的日期/时间很糟糕。这是一个活动预订应用程序,我甚至不想知道有时区这样的事情。无论用户当前位于何处,我都想要一次,只有一次。我不想将时间转换为任何其他语言环境/时区。此应用程序中没有“本地”时间,因为所有内容都基于您预订活动的位置的时间。它需要始终在那个时间表达,而不是你现在的时间。因此,我真的不需要任何时区功能。

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

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

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

最好的方法是什么?

  1. 一个时区内的所有内容(例如UTC)
  2. 强制应用本地时区对每个人都一样吗?
  3. 在活动地点的时区存储时间,然后总是尝试根据该时区显示它?这听起来很复杂,但我担心这是我应该采取的方向,即使它太过分了。
  4. 每次触摸日期时创建日期格式化程序并重置区域设置?
  5. 其他?

1 个答案:

答案 0 :(得分:3)

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

  1. 向用户显示日期/时间时。
  2. 从用户获取日期/时间时。
  3. 一旦有了NSDate,就会忘记时区。按原样坚持NSDate。使用NSDate进行计算。从某种意义上说,这意味着一切都是在UTC时间内完成的。这一切都是一致的。这一切都并不复杂。

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

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

    如果您想显示或获取特定于某个活动的时间,请使用NSDateFormatter并将其时区设置为该活动的时区。

    这并不比这更复杂。

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

    例如,您在伦敦举办的活动有UIDatePicker。将日期选择器的时区设置为伦敦时间。存储生成的NSDate。如果要向用户显示事件的时间,请将NSDateFormatter的时区设置为伦敦时间。然后,无论用户在哪里,它都会显示正确的伦敦时间。