【问题标题】:why Date will return nil when using correct format in swift 4?为什么在 swift 4 中使用正确格式时 Date 会返回 nil?
【发布时间】:2018-12-26 14:33:35
【问题描述】:

所以这是我要转换的字符串日期

2019-03-22T00:00:00

这就是问题所在

记住我使用了“yyyy-MM-dd'T'HH:mm:ss”或“yyyy-MM-ddTHH:mm:ss”或“yyyy-MM-dd HH:mm:ss”或者 yyyy-MM-dd'T'HH:mm:ssZ 和其他一些类似的格式

【问题讨论】:

  • 波斯的夏令时变化。那天没有午夜。
  • stackoverflow.com/questions/36331455/… 的可能重复项。问题是针对objective-c的,但问题和解决方案是相同的。您应该始终设置区域设置和时区。见developer.apple.com/library/archive/qa/qa1480/_index.html
  • 问题是当我使用正确的格式时日期会返回nil
  • @SaeedRahmatolahi 请参阅上面的链接。解析互联网日期时,您必须设置区域设置和时区。
  • @Sulthan - 我知道,这就是为什么它是评论而不是答案。您与我们共享的 QA1480 建议将 en_US_POSIX 作为 ISO8601 不变语言环境。

标签: ios swift date swift4 date-format


【解决方案1】:

解析互联网日期时必须设置时区和语言环境:

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
// necessary to avoid daylight saving (and other time shift) problems
dateFormatter.timeZone = TimeZone(secondsFromGMT: TimeZone.current.secondsFromGMT())
// necessary to avoid problems with 12h vs 24h time formatting
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
print(dateFormatter.date(from: "2019-03-22T00:00:00"))

默认时区包含有关夏令时的信息,并且某些特定时间不存在。相反,我们必须使用通用时区。

https://developer.apple.com/library/archive/qa/qa1480/_index.html

2019 年 3 月 22 日午夜左右是伊朗夏令时变化使一小时不存在的日子和时间。

同样可以使用ISO8601DateFormatter

let dateFormatter = ISO8601DateFormatter()
dateFormatter.formatOptions = ISO8601DateFormatter.Options.withInternetDateTime.subtracting(.withTimeZone)
print(dateFormatter.date(from: "2019-03-22T00:00:00"))

【讨论】:

  • 很可能,该日期字符串应该以 UTC 格式存储/读取,而不是某个本地时区。
  • @Rob 很难说日期本身是否不包含时区。
【解决方案2】:

试试这个功能可能会有所帮助

public func dateFormatter(strDate: String) -> String{
 let dateFormatter = DateFormatter()
 dateFormatter.locale = Locale(identifier: "fa_IR")
 dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"
 let date = dateFormatter.date(from: strDate)
 let dateString = dateFormatter.string(from: date!)
 return dateString
}

【讨论】:

  • 谢谢你帮我找到答案 这里是答案 let dateFormatter = DateFormatter() dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss" dateFormatter.timeZone = TimeZone (secondsFromGMT: TimeZone.current.secondsFromGMT()) 让 date = dateFormatter.date(from: strDate) dateFormatter.dateStyle = DateFormatter.Style.short dateFormatter.locale = NSLocale(localeIdentifier: "fa_IR") 作为区域设置? let pDate = dateFormatter.string(from: date!) dateFormatter.dateFormat = "yyyy/MM/dd" return pDate
【解决方案3】:
dateFormatter.isLenient = true

忽略夏令时偏移期间丢失的小时数

【讨论】:

猜你喜欢
  • 2018-01-24
  • 1970-01-01
  • 2014-03-14
  • 2019-03-10
  • 1970-01-01
  • 2020-06-12
  • 1970-01-01
  • 2012-10-07
  • 2018-02-12
相关资源
最近更新 更多