2016-11-30 4 views
0

Я создаю функцию, чтобы получить дату для китайского нового года с даты, которая передается с datePicker. convertDateFormater преобразует дату форматирования строки в объект даты. дата, которую я получить обратноNSDATE, который возвращается неверно

Возвращается дата = «03-февраля-2030» за год «1970-05-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

Этот код является странным. Вы создаете дату из григорианского календаря (дата 22 мая 1970 года). Из этого вы извлекаете китайский календарный год, а затем создаете совершенно новый день только с того китайского календарного года. Затем вы форматируете эту новую дату в виде григорианского календаря. Зачем? – rmaddy

+0

два календаря разные, я хочу получить китайскую дату нового года в григорианском формате календаря. например, китайский новый год находится на «08-Feb-2016» на 2016 год. –

+0

Я запустил ваш код на игровой площадке Swift, а компонент 'year' из' comps' равен 47 для 'inputDate1'. То, как это становится датой в 2030 году, вне меня. Я не знаком с китайским календарем. – rmaddy

ответ

3

В григорианском календаре, есть две эпохи: в настоящее время «Common Era» (сокращенно «CE», а также известный как «Anno Domini» или «AD») и «Перед Коммон Эра "(сокращенно" BCE ", а также известный как" Before Christ "или" BC "). Таким образом, годовой номер по григорианскому календарю неоднозначен: «1970» сам по себе может означать либо «1970 CE», либо «1970 BCE». Обычно мы принимаем 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. работает как магия –

Смежные вопросы