【问题标题】:Swift - date formatter returns unwanted timeSwift - 日期格式化程序返回不需要的时间
【发布时间】:2019-04-21 23:53:47
【问题描述】:

如果我将“2019-01-01T00:00:00+0000”转换为日期,我希望日期是字符串中的日期 - 2019 年 1 月 1 日。如果我计算秒数时间部分,我希望结果为零。

问题是,当我将字符串转换为日期时,它存储在 UTC 时区中。我的语言环境设置为“en_US_POSIX”,我的时区设置为当前。我的日期格式化程序使用“yyyy-MM-dd'T'HH:mm:ssZ”。我知道最后的 Z 表示 UTC,但我似乎无法找出正确的字段符号来获得我想要的结果。

func convertToDate(_ dateString: String) -> Date {
   let dateFormatter = DateFormatter()
   dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
   dateFormatter.locale = Locale(identifier: "en_US_POSIX")
   dateFormatter.timeZone = .current
   let date = dateFormatter.date(from: dateString)
      else {
         print("DATE ERROR:", dateString)
         return Date()
      }
   return date
} 

【问题讨论】:

  • 您是说要将日期字符串(UTC 时间)转换为本地日期(无论用户当前的时区碰巧是什么),并且在午夜具有相同的日期?因此,无论当前时区如何,所有用户都会在 2019 年 1 月 1 日午夜获得?
  • 不,日期格式中的最终Z 并不表示UTC。它的意思是“解析日期字符串中指定的时区”。在这种情况下,字符串本身通过末尾的 +0000 指定 UTC 时区。
  • 好问题。该应用程序适用于一个时区的一家公司,所以我想答案是肯定的,所有用户都应该得到 2019 年 1 月 1 日,无论如何。而且我必须重新检查关于 Z 的消息来源。我在网上找到了一篇很棒的文章,标题为“了解日期”,但显然,我还没有完全吸收所有这些信息。 (不过,这篇文章非常受欢迎。)

标签: swift date


【解决方案1】:

如果您确定要解析的日期字符串将始终以 +XXXX 形式的时区结尾,那么您可以从字符串中删除该时区,然后将剩余的字符串解析为本地时间。

func convertToDate(_ dateString: String) -> Date? {
    let minusTZ = String(dateString.dropLast(5)) // Assume the string ends with a +9999 timezone
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
    dateFormatter.locale = Locale(identifier: "en_US_POSIX")
    let date = dateFormatter.date(from: minusTZ)
    return date
}

这将为您提供在原始字符串中具有相同日期和时间的本地日期,无论原始字符串的时区如何。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-03
    • 2015-06-17
    • 1970-01-01
    • 2020-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多