为什么在Swift 4中使用正确的格式时,日期将返回nil?

时间:2018-12-26 14:33:35

标签: ios swift date swift4 date-format

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

2019-03-22T00:00:00

这是问题所在 this crash will happen because the date is nil

请记住,我使用了“ 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和其他一些类似的格式

3 个答案:

答案 0 :(得分:4)

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

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"))

答案 1 :(得分:1)

尝试此功能可能会帮助

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
}

答案 2 :(得分:0)

dateFormatter.isLenient = true

忽略夏令时偏移量中的小时数