Tar*_*riq 1 nsdate nsdateformatter dst nstimezone ios
在 api 调用响应中,我得到了不同时区的日期。我想将其转换为用户的本地时区,并且用户可以从 ios 时区列表中选择任何时区。这都是本地的。我们永远不会将选定的用户时区发送到服务器。
在进行任何 api 调用时,假设我正在创建一个事件,并在选择器中选择了开始日期。我应该向其发送全局时区,而不是用户选择的时区,因为它是应用程序的本地时区。
目前,我正在更改选择时的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())
| 归档时间: | 
 | 
| 查看次数: | 1015 次 | 
| 最近记录: |