【问题标题】:How to get NSDate from string without converting it to UTC如何从字符串中获取 NSDate 而不将其转换为 UTC
【发布时间】:2017-09-02 17:43:11
【问题描述】:

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

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

提前致谢。

【问题讨论】:

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

标签: ios swift nsdate nsdateformatter swift2.3


【解决方案1】:

NSDate 没有内置时区。如果您 printNSDate 则它将在 GMT 中打印,因为它必须在 something 中打印。但是日期本身不包含时区,也不能。它们与时区无关。

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

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

【讨论】:

    【解决方案2】:

    好的,所以最后我已经设法根据您的提示解决了问题。

    以下代码符合我的期望:

    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)
    

    谢谢大家!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-21
      • 2011-01-19
      • 1970-01-01
      相关资源
      最近更新 更多