返回的 NSDate 不正确

NSDate which is returned is incorrect

我正在构建一个函数,以根据从 datePicker 传递的日期获取农历新年的日期。 convertDateFormater 将字符串格式的日期转换为日期对象。我回来的日期是

“1970-05-22”年份的返回日期 =“2030 年 2 月 3 日”

但如果我 运行 当前日期 "NSDate() as Date" 我得到正确的输出。 2016 年。

func convertDateFormater(date: String) -> Date
{
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"//this your string date format
dateFormatter.timeZone = NSTimeZone(name: "UTC") as TimeZone!
let date = dateFormatter.date(from: date)
return date!
}

var inputDate1 = convertDateFormater(date: "1970-05-22")
print(inputDate1)

let chineseCalendar = NSCalendar(calendarIdentifier: NSCalendar.Identifier.chinese)!
let formatter: DateFormatter = {
let fmt = DateFormatter()
fmt.dateStyle = .full
fmt.timeStyle = .full
fmt.dateFormat = "dd-MMM-yyyy"
return fmt
}()

var comps = chineseCalendar.components([.year], from: inputDate)
guard let newYear = chineseCalendar.date(from: comps) else {   fatalError("no date for \(comps.year)")}
let getNewYear = formatter.string(from: newYear)
print("\(NSDate() as Date) : \(getNewYear) - \(newYear)")

在公历中,有两个纪元:现在的"Common Era"(简称"CE",也称为"Anno Domini"或"AD")和"Before Common Era"(缩写为 "BCE",也称为 "Before Christ" 或 "BC")。所以公历上的年份数字是模棱两可的:“1970”本身可以表示“1970 CE”或“1970 BCE”。当没有指定时代时,我们通常假设 CE。

我对农历几乎一无所知,但我知道它的纪元比公历多很多,所以农历上的年份数字更加模糊。您发布的代码对时代没有任何作用。因此,我将您的代码复制并粘贴到 playground 中并进行了一项更改:

var comps = chineseCalendar.components([.era, .year], from: inputDate)
//                                      ^^^^^^

输出:

1970-05-22 00:00:00 +0000
2016-11-30 01:40:12 +0000 : 06-Feb-1970 - 1970-02-06 06:00:00 +0000

Indeed, 1970-02-06 was the date of the Chinese new year in 1970 CE on the Gregorian calendar.