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

标签 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. 向用户显示日期/时间时。
  2. 从用户那里获取日期/时间时。

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

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

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

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

没有比这更复杂的了。

我认为这似乎总是更复杂,因为人们开始记录 NSDate 并看到看起来像错误的时间,因为他们没有意识到 NSLog 的输出在UTC 时间,而非本地时间。

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

关于ios - 我怎样才能完全忽略整个应用程序中的时区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34888503/

相关文章:

ios - 如何在 IOS7 UITableView 中滚动到顶部?

javascript - 在网页上检测 iOS 版本

jquery datepicker 依赖结束日期

javascript - 在 css 中选定的开始日期和结束日期之间的悬停效果

ios - Nativescript-Vue -- 本地镜像路径不起作用

xcode - 升级到 Xcode6 Beta3 设置导航标题后的 EXC_BAD_ACCESS

swift - 为弹出窗口设置 UIImageView

ios - 是否 managedObjectContext.object(with :) always refetch data if another (private) managedObjectContext changed and saved it?

javascript - Javascript 日期选择器和时区

ios - 为什么 iOS 11 中导航 backBarButtonItem 的位置出现了三个按钮?