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

时间:2017-04-07 10:57:39

标签: ios swift nsdate nsdateformatter swift2.3

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

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)中实现这一目标?

提前致谢。

2 个答案:

答案 0 :(得分:2)

NSDate没有内置时区。如果您print NSDate,那么它会在GMT中打印,因为它必须在中打印。但是日期本身并不包含时区,也不能包含时区。他们与时区无关。

要在特定时区打印日期,请使用所需的格式和时区配置NSDateFormatter,然后使用.stringFromDate。或者没有设置时区,它会在您设备的时区和地区进行打印,可能是您的用户期望的(例如您的服务器说"事件发生在00:23 +02:00"因此,对于您的CET用户,您将显示"事件发生在23:23",并且您显示的事件发生在"事件发生在下午6:23" 34。)

令人沮丧的是,您只剩下一个问题:日期格式化程序了解原始字符串中的时区(+02:00),但无法以任何方式与您沟通。因此,如果您想拍摄NSDate并在与服务器相同的时区打印,那么您将需要自己确定时区,通过其他渠道进行通信,或者编码。

答案 1 :(得分:0)

好的,最后我设法使用你的提示来解决问题。

以下代码符合我的期望:

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 timeZonePattern = "([+-]([01][0-9]):[0-5][0-9])$" // e.g. "+02:00"
let regex = try! NSRegularExpression(pattern: pattern, options: [])
let dateStringWithoutTimeZone = regex.stringByReplacingMatchesInString(dateString, options: [], range: NSMakeRange(0, dateString.characters.count), withTemplate: "Z")

let date = formatter.dateFromString(dateStringWithoutTimeZone)

谢谢大家!