timeIntervalSince1970 转换 returns 错误年份 Swift 3

timeIntervalSince1970 conversion returns the wrong year in Swift 3

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

这是我的代码

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)

returns

09/20/2017

哪个是正确的

但是,

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

returns

12/31/2019
12/31/2101

根据 Epoch Unix Time Stamp Converter

他们都 return 额外一年
1546214400.0 = 12/31/2018
4133894400.0 = 12/31/2100

有没有人有同样的情况?

问题是日期格式使用 "Year (of "一年中的第几周")" (YYYY) 但您期望的结果是 "Calendar Year" (yyyy) .

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


您可以在 Unicode Standard Date Field Symbol Table 中看到 Yy。在他们的示例中,"Week of Year" 年(1997 年)也比日历年(1996 年)多一年。

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

A common mistake is to use YYYY. yyyy specifies the calendar year whereas YYYY specifies the year (of “Week of Year”), used in the ISO year-week calendar. In most cases, yyyy and YYYY yield the same number, however they may be different. Typically you should use the calendar year.

您使用 YYYY 而不是 yyyy。 查看此页面了解详细信息。 ^^

Difference between 'YYYY' and 'yyyy' in NSDateFormatter