【问题标题】:How to convert server response date to local timezone?如何将服务器响应日期转换为本地时区?
【发布时间】:2015-06-07 01:06:25
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: ios nsdate nsdateformatter dst nstimezone


    【解决方案1】:

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

    【讨论】:

    • 这个答案比我的要好得多,如果您添加相应的文档链接就完美了。
    • 设置默认时区与在格式化程序中添加时区有何不同?是否可以使用 [NSTimeZone setDefaultTimeZone:[NSTimeZone timeZoneWithName:selectedTimeZone]] 这将覆盖本地时区。我还需要处理 NSDateFormatter 中的任何内容吗?
    猜你喜欢
    • 2013-04-26
    • 2021-07-15
    • 1970-01-01
    • 2020-09-08
    • 2014-01-28
    • 1970-01-01
    • 2015-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多