ios - 如何将服务器响应日期转换为本地时区?

标签 ios nsdate nsdateformatter dst nstimezone

在api调用响应中,我得到不同时区的日期。我想将其转换为用户的本地时区,并且用户可以从ios时区列表中选择任何时区。这都是本地的。我们永远不会将选定的用户时区发送到服务器。

并且在进行任何api调用时,可以说我正在选择器中创建一个具有选定开始日期的事件。我应该将它发送给全球时区,而不是与用户选择的时区一起发送,因为它是应用程序本地的。

目前,我正在选择更改defaultTimeZone,以便获得正确的当前日期等。并使用NSDateFormatter和setTimeZone ... [NSTimeZone timeZoneWithName ...

这是一种更好的方法来更改在应用程序本地的defaultTimeZone吗?将NSdate发送到服务器时,应如何将其转换回全局日期?

最佳答案

NSDate是一个时间点,您可以将其称为绝对时间。这个时间对于地球上的每个地方都是一样的。 NSDate不代表格式化为特定位置人们喜欢的时间。这种差异非常重要。

一个NSDate()可以在多个时区中具有多个表示形式。

为了更直观,这5个时钟都代表一个时间点(NSDate实例):

它们只是显示同一时间点的不同表示。

可以说这些时钟就是NSDateFormatter.stringFromDate()。他们将绝对时间点转换为本地表示。

要在不同时区之间进行转换,您无需更改NSDate,您可以更改NSDateFormatter的时区。如果从服务器获取的日期字符串为UTC,则需要一个NSDateFormatter,它使用UTC作为timeZone:

let utcDateFormatter = NSDateFormatter()
utcDateFormatter.timeZone = NSTimeZone(forSecondsFromGMT: 0)
utcDateFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
utcDateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"

let serverString = "2015-04-03 12:34:56" // date from server, as date representation in UTC
let date = utcDateFormatter.dateFromString(serverString) // date you got from server, as point in time

要向您的用户显示该服务器时间,请使用该NSDate并将其放入另一个dateFormatter中:
// display absolute time from server as timezone aware string
let localDateFormatter = NSDateFormatter()
localDateFormatter.dateStyle = NSDateFormatterStyle.LongStyle
localDateFormatter.timeStyle = NSDateFormatterStyle.LongStyle
let localDateString = localDateFormatter.stringFromDate(date)

如果要将日期字符串发送回服务器,请使用NSDate并将其放入UTC dateFormatter中。
// send back time to server
let dateString = utcDateFormatter.stringFromDate(NSDate())

关于ios - 如何将服务器响应日期转换为本地时区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29406819/

相关文章:

ios - 来自视频 : Default to speaker 的 Swift 音频

ios - 找不到 Cordova_Plugins.js

iphone - NSDateFormatter 获取小时和时间

iphone - 比较 NSDate 的某些组件?

ios - NSDate 的解析时间

objective-c - 12 小时模式的 NSDateFormatter

ios - SVN 显示版本为 1 :74M and svn log is empty apart from initial import?

javascript - iOS 键盘使用 Phonegap 调整屏幕大小

ios - 尝试仅将 NSDate 用于时间

ios - 如何使用日期格式获取小时