2016-11-30 126 views
0

我構建了一個函數,以便從datePicker傳遞的日期中獲取中國新年的日期。 convertDateFormater將字符串格式化的日期轉換爲日期對象。這是我回來的日期是返回的NSDate不正確

返回的日期=「03 - 2月 - 2030」的年度「1970年5月22日」

,但如果我運行當前的日期「的NSDate()的日期」我得到正確的輸出。在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)") 
+0

此代碼是奇怪。您從公曆創建日期(1970年5月22日)。從中提取中國曆年,然後從中國曆年創建一個全新的日子。然後,將該新日期格式化爲公曆日曆格式。爲什麼? – rmaddy

+0

這兩個日曆不同,我想以公曆的格式獲取中國的新年日期。例如中國新年就在2016年的「08-Feb-2016」。 –

+0

我在Swift操場上運行了代碼,'inputDate1'的'comps'中的'year'組件爲47。 2030年如何成爲一個約會是超越我的。我對中國日曆不熟悉。 – rmaddy

回答

3

在公曆中,有兩個時代:目前的「共同的時代」(以下簡稱「CE」,也被稱爲「公元」或「AD」)和「通用之前時代「(縮寫爲」BCE「,也被稱爲」在基督之前「或」BC「)。因此,公曆一年的數字不明確:「1970」本身可能意味着「1970年代」或「1970年代」。當沒有指定時代時,我們通常假設CE。

我對中國曆法幾乎一無所知,但我知道它比公曆有更多的時代,所以中國曆法上的一年數字更加模糊。您發佈的代碼對時代沒有任何作用。所以我複製並粘貼您的代碼放到一個遊樂場和一個變化:

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.

+0

你是一個傳奇,謝謝@rob。像魔術一樣工作 –