从dateFormat获取错误的日期

时间:2018-10-08 11:50:35

标签: swift date dateformatter

对于日期输入“ 00/02/02”
格式样式为yy / MM / dd
 我得到正确的输出,如02/01/2000

但是问题是尝试使用“ 00/01/01”时 得到这样的输出'01 / 01/12100'

但是我不知道为什么今年会出现 12100

我的代码是

let str = "00/01/01"

let inputFormatter = DateFormatter()
inputFormatter.dateFormat = "yy/MM/dd"
if let showDate = inputFormatter.date(from: str) {
   inputFormatter.dateFormat = "dd/MM/yyyy"
   let resultString = inputFormatter.string(from: showDate)
   print(resultString)
 }

年份输入类型始终为yy格式。

2 个答案:

答案 0 :(得分:1)

根据@MartinR建议 将 inputFormatter.defaultDate设置为当前日期或Date(timeIntervalSinceReferenceDate:0)效果很好

let str = "00/01/01"

let inputFormatter = DateFormatter()
inputFormatter.defaultDate = Date(timeIntervalSinceReferenceDate: 0)
inputFormatter.dateFormat = "yy/MM/dd"
if let showDate = inputFormatter.date(from: str) {
  inputFormatter.dateFormat = "dd/MM/yyyy"
 let resultString = inputFormatter.string(from: showDate)
 print(resultString)
 }

答案 1 :(得分:1)

我设法通过将格式化程序的时区设置为您的本地时区来重现此错误,然后再从中获取日期:

inputFormatter.timeZone = TimeZone(identifier: "Asia/Kolkata")
//Or
inputFormatter.timeZone = TimeZone(identifier: "Asia/Calcutta") 

它们都导致01/01/12100

实际上,使用日期格式yy/MM/dd hh:mm:ss,从00/01/01 00:00:0000/01/01 05:29:59开始的所有日期都将成为12100的年份部分。这是由于GMT将加尔各答的时区偏移+ 05H30。这是一个错误。

将时区设置为UTC会产生所需的输出:

inputFormatter.timeZone = TimeZone(identifier: "UTC")  //01/01/2000

此错误也发生在其他时区:

inputFormatter.timeZone = TimeZone(identifier: "Africa/Addis_Ababa")
inputFormatter.timeZone = TimeZone(identifier: "Europe/Moscow")
inputFormatter.timeZone = TimeZone(identifier: "Asia/Hong_Kong")

基本上所有具有格林尼治标准时间 + hh:mm

的时区