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

How to convert server response date to local timezone?

在 api 呼叫响应中,我得到了不同时区的日期。我想将其转换为用户的本地时区,而且用户可以 select ios 时区列表中的任何时区。这都是本地的。我们永远不会向服务器发送 selected 用户时区。

在进行任何 api 调用时,可以说我正在创建一个事件,其中 select 在选择器中编辑了开始日期。我应该发送全球时区而不是用户 selected 时区,因为它是应用程序的本地时区。

目前我正在更改 selection 上的 defaultTimeZone 以便我获得正确的当前日期等。并将 NSDateFormatter 与 setTimeZone 一起使用... [NSTimeZone timeZoneWithName...

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

NSDate是一个时间点,你可以称之为绝对时间。这个时间对于地球上的每个地方都是一样的。 NSDate 不代表在特定位置根据人们的喜好格式化的时间。这种区分非常重要。

单个 NSDate() 可以在多个时区有多个表示。

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

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

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

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

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())