这一年发生了什么?

What is happening to the year?

将其放入 playground 会产生我不理解的输出。 Dec 30, 2014 的第一个输出有意义,但是第二个 Dec 2015 没有意义。

为什么我的第二个输出显示的是 2015 年?我的语言环境是使用公历的美国。

import UIKit

let dateString = "2014-12-30T00:00:00.000-05:00"
let _dateFormatter = NSDateFormatter()
_dateFormatter.calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)
_dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss'.'SSSZZZZZ"

let date = _dateFormatter.dateFromString(dateString)!

let format = NSDateFormatter.dateFormatFromTemplate("MMM d YYYY", options: 0, locale: NSLocale.currentLocale())
let formatter = NSDateFormatter()
formatter.dateFormat = format
formatter.dateStyle = NSDateFormatterStyle.MediumStyle


let monthFormat = NSDateFormatter.dateFormatFromTemplate("MMM YYYY", options: 0, locale: NSLocale.currentLocale())
let monthFormatter = NSDateFormatter()
monthFormatter.dateFormat = monthFormat

let fullDate = formatter.stringFromDate(date)
let monthDate = monthFormatter.stringFromDate(date)

您使用的字符串格式有误。您必须更改“Y”,它代表一年中的一周。只需将其更改为“y”:

let dateString = "2014-12-30T00:00:00.000-05:00"
let dateFormatter = DateFormatter()
dateFormatter.calendar = Calendar(identifier: .gregorian)
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ"
 
if let date = dateFormatter.date(from: dateString) {
    print(date)  // "2014-12-30 05:00:00 +0000\n"
    
    dateFormatter.setLocalizedDateFormatFromTemplate("yyyyMMMd")
    let fullDate = dateFormatter.string(from: date)
    print(fullDate)   // "Dec 30, 2014\n"
    
    dateFormatter.setLocalizedDateFormatFromTemplate("yyyyMMM")
    let monthDate = dateFormatter.string(from: date)
    print(monthDate)  // "Dec 2014\n"
}

如果您需要一些参考,请查看此图表: