2016-11-30 151 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。像魔术一样工作 –