4

相同的代码

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];

Mac OS X 目标正确显示 formattedDate

1577 年 12 月 13 日

iOS 5.0 目标显示

1577 年 12 月 23 日

好像 Julian -> Gregorian 转换被窃听了

任何想法如何克服?

4

1 回答 1

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]);

你会得到这些输出(除了 <-- 注释):

苹果电脑

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

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

在 Mac 上,NSDateFormatter 切换到儒略历(也称为旧式日期),用于 1582 年 10 月 15 日之前的日期,这是公历中的第一天(Apple 使用的日期。某些国家/地区采用不同的日期)。如果您引用此日期之前的公历日期,则这些日期在预测的公历中,即公历存在之前的日期。而且,正如您从第二个输出中看到的那样,iOS 平台上的 NSDateFormatter 并没有切换到儒略历,而是保留在预测的公历中。您的输出中的差异正是在从儒略到格里高利的过渡中跳过的 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在不同平台上的实现差异!

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

于 2012-09-19T10:32:18.877 回答