ios - 如何从字符串中获取 NSDate 而不将其转换为 UTC

标签 ios swift nsdate nsdateformatter swift2

我有以下问题。假设我从服务器收到一些包含以下格式的日期时间的字符串:

yyyy-MM-dd'T'HH:mm:ssxxxx

这是一个服务器日期时间,我想在应用程序中按原样显示它。所以如果我收到日期时间:

2017-04-07T10:29:23+ 02:00

这意味着在服务器上是 10:29:23 (08:29:23 UTC)

我想在应用程序中将其显示为:

04.07.2017 10:29:23

但是每当我尝试将字符串转换为 NSDate 时,我都会将日期转换为 UTC,这是不需要的,因为我丢失了有关服务器时区的信息。我现在使用以下代码:

let formatter = NSDateFormatter()
formatter.calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierISO8601)
formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssxxxx"

let date = formatter.dateFromString(dateString)

我如何在 Swift (2.3) 中实现这一点?

提前致谢。

最佳答案

NSDate 没有内置时区。如果您打印 一个NSDate,那么它将以GMT 格式打印,因为它必须以某种方式 格式打印。但是日期本身不包含时区,也不能。它们与时区无关。

要打印特定时区的日期,请使用所需的格式和时区配置 NSDateFormatter,然后使用 .stringFromDate。或者不设置时区,它会在您设备的时区和区域设置中打印,这可能是您的用户所期望的(例如,您的服务器说“事件发生在 00:23+02:00”,所以对于您的 CET 用户,您'将显示“事件发生在 23:23”,并向您的 EST 用户显示“事件发生在下午 6:23”)。

令人沮丧的是,您只剩下一个问题:日期格式化程序理解您原始字符串中的时区(+02:00),但无法通过任何方式将其传达给您。所以如果你想获取一个 NSDate 并在与你的服务器相同的时区打印它,那么你将不得不自己确定时区,通过另一个 channel 传达它,或者硬-编码。

关于ios - 如何从字符串中获取 NSDate 而不将其转换为 UTC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43276428/

相关文章:

ios - ProjectName-Swift 问题 - 找不到 'CLLocationManagerDelegate' 的协议(protocol)声明

ios - Swift UITableView 不显示内容

ios - 快速访问数组中对象的属性,返回 nil

ios - GKGameSession- saveData 在 getShareURLWithCompletionHandler 之后总是失败并出现 malloc 错误

ios - 如何使用SpriteKit放置比场景更宽的背景图像?

ios - 将 NSDates 天设置为相同的值

ios - MKMapView 不填充 View (iOS)

ios - 如何将 AVCaptureSession.sessionPreset 为 720x1280px(或任何 1/1.77 比例)

ios - 如何让 NSLocale.autoupdatingCurrentLocale() 只返回日期?

ios - timeIntervalSinceNow 用于获取耗时值的用法