timeIntervalSince1970转换在Swift 3中返回错误的年份

时间:2017-10-06 07:30:12

标签: ios swift3 nsdateformatter unix-timestamp

我遇到了timeIntervalSince1970错误年份的问题。

这是我的代码

func unixToDateString(timeStamp: TimeInterval) -> String {
    let date = Date(timeIntervalSince1970: timeStamp)
    let dateFormatter = DateFormatter()
    dateFormatter.locale = Locale(identifier:Locale.current.identifier)
    dateFormatter.dateFormat = "MM/dd/YYYY"
    return dateFormatter.string(from: date)
}

这些是我的结果

unixToDateString(timeStamp: 1505896961.0)

返回

09/20/2017

这是正确的

但是,

unixToDateString(timeStamp: 1546214400.0)
unixToDateString(timeStamp: 4133894400.0)

返回

12/31/2019
12/31/2101
根据{{​​3}}

,他们都返回一年
1546214400.0 = 12/31/2018
4133894400.0 = 12/31/2100

有没有人有相同的情况?

2 个答案:

答案 0 :(得分:1)

问题是日期格式使用“年(”年“周”)(YYYY),但您期望的结果是“日历年”(yyyy)。

将日期格式更改为"MM/dd/yyyy"后,我看到了您期望的结果(2018年和2100年)。

您可以在Unicode Standard Date Field Symbol Table中看到Yy。在他们的例子中,“年度周”(1997年)也比日历年(1996年)多一个。

Data Formatting Guide也会出现同样的问题,并指出通常应使用日历日期(yyyy):

  

常见的错误是使用YYYYyyyy指定日历年,而YYYY指定ISO年度日历中使用的年份(“年度周”)。在大多数情况下,yyyyYYYY会产生相同的数字,但它们可能会有所不同。通常,您应该使用日历年。

答案 1 :(得分:0)

你使用YYYY代替yyyy。 查看此页面了解详细信息。 ^^

Difference between 'YYYY' and 'yyyy' in NSDateFormatter