1

我正在制作一个支持将日期从佛教日历转换为公历的应用程序(注意:我正在测试的设备的“常规>国际>日历”设置是“佛教”。)。但是,我不明白为什么 NSDateFormatter 不能正确解析我的日期。这是我的代码:

NSDate *now = [NSDate date];

NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.calendar = gregorianCalendar;
formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss Z";

NSString *formattedDate = [formatter stringFromDate:now];
NSDate *boomDate = [formatter dateFromString:formattedDate];

NSLog(@"now: %@, formattedDate (as string) > %@, boomDate (as date) > %@", now, formattedDate, boomDate);

Xcode 的日志说:

now: 2556-05-23 07:11:03 +0000, formattedDate (as string) > 2013-05-23 15:11:03 +0800, boomDate (as date) > 2556-05-23 07:11:03 +0000

当我将formattedDate(这是一个NSString)转换为NSDate时,即使我正确设置了它的属性(尤其是formatter.calendar),为什么我的NSDateFormatter会根据佛教日历格式对其进行解析。我需要将我的formattedDate转换为公历格式的 NSDate。根据它的逻辑,我希望 NSDateFormatter 给我一个公历格式的日期,但它没有。

基本上,我需要一个遵循佛教 NSDate 的格里高利格式的 NSDate。

有任何想法吗?

4

1 回答 1

3

NSDate只是一个双精度值的对象包装器,表示与参考日期的偏移量。它不包含有关日历或时区的信息。这只是一个时间点。

我们人类决定如何称呼这个时间点取决于我们的日历和时区。如果没有日历和时区,NSDate 对象就没有意义。

当您使用 打印日期对象时NSLog-description将调用您的日期对象上的方法,并且该-description方法使用您设备的区域设置格式化字符串。这就是为什么boomDate以佛教日历属性显示的原因;您的佛教地区使用佛教日历。

和变量相等(尝试now调用boomDate[now isEqualToDate:boomDate]

您可以看出转换为公历成功,因为formattedDate显示的日期与公历中的日期相同。

于 2013-05-24T11:14:17.423 回答