2015-09-03 2 views
0

Может кто-то объяснить, почему NSDateFormatter возвращать те же строки из разных дат:NSDateFormatter же строка для разных дат

NSDateFormatter *f = [NSDateFormatter new]; 

f.dateFormat = @"MM/dd/yyyy"; 

NSDate *dateYear0 = [[NSCalendar currentCalendar] dateWithEra:0 year:0 month:3 day:31 hour:0 minute:0 second:0 nanosecond:0]; 
NSDate *dateYear1 = [[NSCalendar currentCalendar] dateWithEra:0 year:1 month:3 day:31 hour:0 minute:0 second:0 nanosecond:0]; 

NSString *dateStrYear0 = [f stringFromDate:dateYear0]; 
NSString *dateStrYear1 = [f stringFromDate:dateYear1]; 

NSLog(@"dateYear0=%@ \t\t dateStrYear0=%@",dateYear0,dateStrYear0); 
NSLog(@"dateYear1=%@ \t\t dateStrYear1=%@",dateYear1,dateStrYear1); 

Оба dateStr1 и dateStr2 имеют одинаковые значения:

NSLog результат:

dateYear0=0001-03-30 21:57:56 +0000  dateStrYear0=03/31/0001 
dateYear1=0000-03-30 21:57:56 +0000  dateStrYear1=03/31/0001 

Его внешний вид как-то влияет на это как-то?

Благодаря

+0

check DateHelper класс, который вы внедрили здесь, должны быть некоторые сложные изменения. – bhanu

+0

DateHelper работает правильно. Код, который использует только NSDateFormatter, производит тот же результат. – Pavel

+0

, когда вы проходите «[DateHelper dateWithYear: 0 month: 3 day: 31]», пожалуйста, NSLog и проверьте, что он возвращает. Не выполнять «dateStr1» – bhanu

ответ

2

Это потому, что 0 год не существует в Gregorian Calendar. При работе с датами AD минимальное возможное значение для NSDate составляет «0001-01-01 00:00:00 +0000», поэтому оно использует «0001» в качестве года, когда используется меньшее значение, чем 1. Вы можете проверить минимальное значение NSDate с классом distantPast метод.

Также, если вы хотите использовать даты BC, вы должны проверить Apple guideline для получения дополнительной информации.

+0

Звучит хорошо для меня. – trojanfoe

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