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

Ios 如何从字符串中获取NSDate而不将其转换为UTC,ios,swift,nsdate,nsdateformatter,swift2.3,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,这是不需要的,因为我丢失了

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

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
并将其打印在与服务器相同的时区中,那么您必须自己确定时区,通过另一个通道进行通信,或者对其进行硬编码。

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

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


令人沮丧的是,您只剩下一个问题:日期格式化程序理解原始字符串中的时区(+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)

谢谢大家!

好的,我终于用你的提示解决了这个问题

以下代码符合我的期望:

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)

谢谢大家!

你的代码是正确的。如果您
打印
您将获得UTC的日期。在操场上试试看。两个注意事项:
xxxx
可以替换为
Z
,并且在日期字符串中,加号/减号和时区值之间不能有空格字符。感谢回复。是的,我知道它会给我一个UTC,但正如我在上面写的,我不想要这个。我想显示我收到的服务器日期时间。例如,如果服务器上的时间是10:00(UTC 8:00),我希望在应用程序中也显示10:00(独立于应用程序时区)。如果要忽略时区,则必须从日期字符串中删除时区信息(例如使用
replaceCurrencesofString
RegularExpression
选项)。老实说,我考虑过这一点,但我认为可能有一些很好的解决办法。还有其他想法吗?你的代码是正确的。如果您
打印
您将获得UTC的日期。在操场上试试看。两个注意事项:
xxxx
可以替换为
Z
,并且在日期字符串中,加号/减号和时区值之间不能有空格字符。感谢回复。是的,我知道它会给我一个UTC,但正如我在上面写的,我不想要这个。我想显示我收到的服务器日期时间。例如,如果服务器上的时间是10:00(UTC 8:00),我希望在应用程序中也显示10:00(独立于应用程序时区)。如果要忽略时区,则必须从日期字符串中删除时区信息(例如使用
replaceCurrencesofString
RegularExpression
选项)。老实说,我考虑过这一点,但我认为可能有一些很好的解决办法。还有其他想法吗?