从佛教日历转换为公历日期格式时,NSDateFormatter表现不正常

时间:2013-05-23 06:46:02

标签: ios objective-c nsdate nsdateformatter

我正在制作一个支持将佛教日历中的日期转换为格里高利的应用程序(注意:我正在测试的设备的“General> International> Calendar”设置是“佛教”。)。但是,我无法弄清楚为什么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时,为什么我的NSDateFormatter会根据佛教日历格式对其进行解析,即使我正确设置了它的属性(尤其是{{1} })。我需要将我的formatter.calendar转换为具有公历日历格式的NSDate。基于它的逻辑,我期待NSDateFormatter给我一个格里高利格式的日期,但事实并非如此。

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

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

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

我们作为人类决定称之为时间点取决于我们的日历和时区。没有日历和时区,NSDate对象没有意义。

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

nowboomDate个变量相等(尝试调用[now isEqualToDate:boomDate])。

你可以说转换为格里高利成功了,因为formattedDate显示的日期与格里高利历中的日期一样。