如何从字符串中获取 NSDate 而不将其转换为 UTC
How to get NSDate from string without converting it to UTC
我有以下问题。假设我从服务器收到一些包含以下格式的日期时间的字符串:
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
没有内置时区。如果你 print
一个 NSDate
那么它会在格林威治标准时间打印,因为它必须在 something 中打印。但是日期本身不包含时区,也不能。它们与时区无关。
要打印特定时区的日期,请使用所需的格式和时区配置 NSDateFormatter
,然后使用 .stringFromDate
。或者不设置时区,它会在您设备的时区和区域设置中打印,可能是您的用户所期望的(例如,您的服务器说 "event happened at 00:23+02:00" 所以您将向您的 CET 用户显示 "event happened at 23:23",并向您的 EST 用户显示 "event happened at 6:23PM")。
令人沮丧的是,您只剩下一个问题:日期格式化程序理解您原始字符串中的时区(+02:00),但无法通过任何方式将其传达给您。因此,如果您想使用 NSDate
并在与您的服务器相同的时区打印它,那么您将不得不自己确定时区,通过另一个渠道进行通信,或者对其进行硬编码.
好的,所以我终于根据您的提示解决了问题。
以下代码符合我的预期:
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)
谢谢大家!
我有以下问题。假设我从服务器收到一些包含以下格式的日期时间的字符串:
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
没有内置时区。如果你 print
一个 NSDate
那么它会在格林威治标准时间打印,因为它必须在 something 中打印。但是日期本身不包含时区,也不能。它们与时区无关。
要打印特定时区的日期,请使用所需的格式和时区配置 NSDateFormatter
,然后使用 .stringFromDate
。或者不设置时区,它会在您设备的时区和区域设置中打印,可能是您的用户所期望的(例如,您的服务器说 "event happened at 00:23+02:00" 所以您将向您的 CET 用户显示 "event happened at 23:23",并向您的 EST 用户显示 "event happened at 6:23PM")。
令人沮丧的是,您只剩下一个问题:日期格式化程序理解您原始字符串中的时区(+02:00),但无法通过任何方式将其传达给您。因此,如果您想使用 NSDate
并在与您的服务器相同的时区打印它,那么您将不得不自己确定时区,通过另一个渠道进行通信,或者对其进行硬编码.
好的,所以我终于根据您的提示解决了问题。
以下代码符合我的预期:
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)
谢谢大家!