在1577年之前破坏的iOS中的日历计算......(julian - > gregorian)

iva*_*982 4 iphone nscalendar ios

相同的代码

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"d MMMM yyyy GG"];
//13th of December 1577
NSDate * aDate = [NSDate dateWithTimeIntervalSince1970:-12371067248]; 

NSString * formattedDate = [dateFormatter stringFromDate:aDate];
Run Code Online (Sandbox Code Playgroud)

Mac OS X目标正确显示formattedDate

1577年12月13日

iOS 5.0目标显示

1577年12月23日

好像朱利安 - >格里高利过渡被窃听了

任何想法如何克服?

lpa*_*lpa 7

尝试在Mac和iOS上运行此代码

NSDateFormatter *localFormatter = [[NSDateFormatter alloc] init];
localFormatter.timeStyle = NSDateFormatterNoStyle;
localFormatter.dateStyle = NSDateFormatterMediumStyle;

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"g"];  // g = julian day number
NSDate *d2299159 = [dateFormatter dateFromString:@"2299159"];
NSDate *d2299160 = [dateFormatter dateFromString:@"2299160"];
NSDate *d2299161 = [dateFormatter dateFromString:@"2299161"];
NSDate *d2299162 = [dateFormatter dateFromString:@"2299162"];


NSLog(@"Julian Day Number 2299159 = %@", [localFormatter stringFromDate:d2299159]);
NSLog(@"Julian Day Number 2299160 = %@", [localFormatter stringFromDate:d2299160]);
NSLog(@"Julian Day Number 2299161 = %@", [localFormatter stringFromDate:d2299161]);
NSLog(@"Julian Day Number 2299162 = %@", [localFormatter stringFromDate:d2299162]);
Run Code Online (Sandbox Code Playgroud)

你将获得这些输出(< - notes除外):

苹果电脑

Julian Day Number 2299159 = 1582-10-03   <-- Julian calendar
Julian Day Number 2299160 = 1582-10-04   <-- Julian calendar
Julian Day Number 2299161 = 1582-10-15   <-- Gregorian calendar
Julian Day Number 2299162 = 1582-10-16   <-- Gregorian calendar
Run Code Online (Sandbox Code Playgroud)

iOS版

Julian Day Number 2299159 = 1582-10-13   <-- Proleptic Gregorian calendar
Julian Day Number 2299160 = 1582-10-14   <-- Proleptic Gregorian calendar
Julian Day Number 2299161 = 1582-10-15   <-- Gregorian calendar
Julian Day Number 2299162 = 1582-10-16   <-- Gregorian calendar
Run Code Online (Sandbox Code Playgroud)

在Mac上,NSDateFormatter切换到1582年10月15日之前的日期(也称为旧式日期),这是格里高利历中的第一天(Apple与之合作.一些国家在不同的日期采用).如果您在此日期之前提及格里高利日期,则这些日期属于公历日历,即格里高利存在之前的日期.而且,正如您从第二个输出中看到的那样,iOS平台上的NSDateFormatter不会切换到儒略历,而是保留在公历中.输出的差异恰好是从Julian到Gregorian的过渡中跳过的10个跳过天数.

我强烈推荐这个小程序,如果你想玩不同的日历来了解更多关于这个东西:http: //www.cs.tau.ac.il/~nachum/calendar-book/Calendrica.html 这些家伙也写道一本关于这个主题的精彩书籍.

此外,Apple在其文档中有一些关于历史日期的部分:https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/DatesAndTimes/Articles/dtHist.html#//apple_ref/doc/ uid/TP40010240-SW1 但是,他们没有提到不同平台上的NSDateFormatter实现差异!

使用日历来自地狱 - 祝你好运:-)