Ios NSDateFormatter分析日期落后2秒

Ios NSDateFormatter分析日期落后2秒,ios,swift,nsdateformatter,Ios,Swift,Nsdateformatter,我已经测试了一些格式化程序,但是我得到的结果相差2秒,真奇怪。 我读过一些关于堆栈溢出的帖子,但以前从未见过类似的内容 func testDates() { let formatter = NSDateFormatter() formatter.locale = NSLocale.systemLocale() formatter.dateFormat = "yyyy-M-d" formatter.timeZone = NSTimeZone.systemTimeZ

我已经测试了一些格式化程序,但是我得到的结果相差2秒,真奇怪。 我读过一些关于堆栈溢出的帖子,但以前从未见过类似的内容

func testDates() {

    let formatter = NSDateFormatter()
    formatter.locale = NSLocale.systemLocale()
    formatter.dateFormat = "yyyy-M-d"
    formatter.timeZone = NSTimeZone.systemTimeZone()

    let formatter2 = NSDateFormatter()
    formatter2.locale = NSLocale(localeIdentifier: "en_US_POSIX")
    formatter2.dateFormat = "yyyy-MM-dd"
    formatter2.timeZone = NSTimeZone.systemTimeZone()


    let tests = ["923-05-17","1700-05-01", "1701-9-9", "1702-9-01", "1703-09-5", "1991-01-05"]
    let dates = tests.map({$0.toDate(formatter)})
    let dates2 = tests.map({$0.toDate(formatter2)})

    println(dates)
}



extension String {
    func toDate(formatter: NSDateFormatter) -> NSDate? {
        return formatter.dateFromString(self)
    }

}
结果如下:

Printing description of dates:
([NSDate?]) dates = 6 values {
  [0] = 0923-05-16 23:52:58 PST
  [1] = 1700-04-30 23:52:58 PST
  [2] = 1701-09-08 23:52:58 PST
  [3] = 1702-08-31 23:52:58 PST
  [4] = 1703-09-04 23:52:58 PST
  [5] = 1991-01-05 00:00:00 PST
}
Printing description of dates2:
([NSDate?]) dates2 = 6 values {
  [0] = 0923-05-16 23:52:58 PST
  [1] = 1700-04-30 23:52:58 PST
  [2] = 1701-09-08 23:52:58 PST
  [3] = 1702-08-31 23:52:58 PST
  [4] = 1703-09-04 23:52:58 PST
  [5] = 1991-01-05 00:00:00 PST
}
(lldb) 

似乎这是一个问题,解析20世纪以前的日期:)

var=[String]()
对于0…22中的x{
世纪。附加(“\(x*100)-01-01”)
}
让centuriesDates=centuries.map({$0.toDate(格式化程序)})
世纪印刷说明:
([String])世纪=23个值{
[0] = "0-01-01"
[1] = "100-01-01"
[2] = "200-01-01"
[3] = "300-01-01"
[4] = "400-01-01"
[5] = "500-01-01"
[6] = "600-01-01"
[7] = "700-01-01"
[8] = "800-01-01"
[9] = "900-01-01"
[10] = "1000-01-01"
[11] = "1100-01-01"
[12] = "1200-01-01"
[13] = "1300-01-01"
[14] = "1400-01-01"
[15] = "1500-01-01"
[16] = "1600-01-01"
[17] = "1700-01-01"
[18] = "1800-01-01"
[19] = "1900-01-01"
[20] = "2000-01-01"
[21] = "2100-01-01"
[22] = "2200-01-01"
}
打印centuriesDates的说明:
([NSDate?])centuriesDates=23个值{
[0]=零
[1] =0099-12-3123:52:58太平洋标准时间
[2] =0199-12-3123:52:58太平洋标准时
[3] =0299-12-3123:52:58太平洋标准时
[4] =0399-12-3123:52:58太平洋标准时
[5] =0499-12-3123:52:58太平洋标准时
[6] =0599-12-3123:52:58太平洋标准时
[7] =0699-12-3123:52:58太平洋标准时
[8] =0799-12-3123:52:58太平洋标准时间
[9] =0899-12-3123:52:58太平洋标准时
[10] =0999-12-3123:52:58太平洋标准时间
[11] =1099-12-3123:52:58太平洋标准时
[12] =1199-12-3123:52:58太平洋标准时
[13] =1299-12-3123:52:58太平洋标准时
[14] =1399-12-3123:52:58太平洋标准时
[15] =1499-12-3123:52:58太平洋标准时
[16] =太平洋标准时间1599-12-3123:52:58
[17] =太平洋标准时间1699-12-3123:52:58
[18] =1799-12-3123:52:58太平洋标准时

[19] =1900-01-01 00:00:00 PST如果时间不是原始字符串的一部分,我认为你不应该关心时间。我担心的不是时间,而是它通过将时钟向后拨2秒来设置日期。参见“1700-05-01”=>1700-04-30 23:52:58 PSTbtw,您的休息时间为7分2秒。用于转换日期的算法假定对“标准时间”的某些更正是在过去进行的。这不是“错误”,而是它的工作方式。我想是这样:)@DavidRönnqvist@DavidRönnqvist-这不是“未定义的行为”--定义非常明确。UTC到各个时区的“映射”中存在许多不连续性。
    var centuries = [String]()
    for x in 0...22 {
        centuries.append("\(x*100)-01-01")
    }
    let centuriesDates = centuries.map({$0.toDate(formatter)})


Printing description of centuries:
([String]) centuries = 23 values {
  [0] = "0-01-01"
  [1] = "100-01-01"
  [2] = "200-01-01"
  [3] = "300-01-01"
  [4] = "400-01-01"
  [5] = "500-01-01"
  [6] = "600-01-01"
  [7] = "700-01-01"
  [8] = "800-01-01"
  [9] = "900-01-01"
  [10] = "1000-01-01"
  [11] = "1100-01-01"
  [12] = "1200-01-01"
  [13] = "1300-01-01"
  [14] = "1400-01-01"
  [15] = "1500-01-01"
  [16] = "1600-01-01"
  [17] = "1700-01-01"
  [18] = "1800-01-01"
  [19] = "1900-01-01"
  [20] = "2000-01-01"
  [21] = "2100-01-01"
  [22] = "2200-01-01"
}
Printing description of centuriesDates:
([NSDate?]) centuriesDates = 23 values {
  [0] = nil
  [1] = 0099-12-31 23:52:58 PST
  [2] = 0199-12-31 23:52:58 PST
  [3] = 0299-12-31 23:52:58 PST
  [4] = 0399-12-31 23:52:58 PST
  [5] = 0499-12-31 23:52:58 PST
  [6] = 0599-12-31 23:52:58 PST
  [7] = 0699-12-31 23:52:58 PST
  [8] = 0799-12-31 23:52:58 PST
  [9] = 0899-12-31 23:52:58 PST
  [10] = 0999-12-31 23:52:58 PST
  [11] = 1099-12-31 23:52:58 PST
  [12] = 1199-12-31 23:52:58 PST
  [13] = 1299-12-31 23:52:58 PST
  [14] = 1399-12-31 23:52:58 PST
  [15] = 1499-12-31 23:52:58 PST
  [16] = 1599-12-31 23:52:58 PST
  [17] = 1699-12-31 23:52:58 PST
  [18] = 1799-12-31 23:52:58 PST
  [19] = 1900-01-01 00:00:00 PST   <<<< Finally started working
  [20] = 2000-01-01 00:00:00 PST
  [21] = 2100-01-01 00:00:00 PST
  [22] = 2200-01-01 00:00:00 PST
}
(lldb)