iphone - iOS 中的日历计算在 1577 年之前就中断了...(朱利安-> 公历)

标签 iphone ios nscalendar

相同的代码

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 目标正确显示格式化日期

13th of December 1577

iOS 5.0 目标显示

23rd of December 1577

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

有什么办法可以克服吗?

最佳答案

尝试在 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 并未切换到 Julian 日历,而是保留在 proleptic Gregorian 日历中。 您的输出中的差异正是在从 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 在不同平台上的实现差异!

使用日历简直就是 hell - 祝你好运 :-)

关于iphone - iOS 中的日历计算在 1577 年之前就中断了...(朱利安-> 公历),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10524266/

相关文章:

ios - 如何在 iOS 中为 NSThread 获取 "parent"线程?

iphone - Apple 会拒绝使用 sksmtpmessage 框架在后台发送电子邮件的应用程序吗?

ios - 什么是iOS中的filename + util.m/.h文件?

ios - 我可以安全地删除 ~/Library/Application Support/iPhone Simulator/6.1/tmp 目录的内容吗?

ios - swift : Filtering NSDate by time intervals

objective-c - 在 XCode 5 中显示该特定年份的月份列表

iphone - 由于从 NSMutableArray 中删除 CCSprite 等元素而导致崩溃

android - Ios - 需要 Android 建议

ios - 在IOS SDK中获取星期日期

iphone - insertSubviewBelow 未在正确的帧 Y 偏移处插入