日历下的核心数据错误地比较日期

时间:2011-05-31 08:23:37

标签: iphone core-data unicode localization nsdate

所以我似乎被iPhone的日历支持again灼伤了。我遇到了核心数据比较日期的问题。核心数据似乎是使用公历来存储日期,因为它们以20XX-MM-dd格式出现。但是当我以这种方式构建NSPredicate时

[nsRequest setPredicate:[NSPredicate predicateWithFormat:@"publish <= %@ AND expires >= %@", [NSDate date], [NSDate date]]]

如果用户的设备未设置为公历,则不会显示任何项目,因为在与输入日期进行比较之前,核心数据似乎不会将其本地化为NSDates。

所以看来如果日期是今天'2011-05-31'在日历日历模式下,核心数据使用'0023-05-31',因为它是当前皇帝的第23年,将输入日期设置为比它被比较的2000年之前。

我发现我可以这样解决这个问题

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:[[NSLocale preferredLanguages] objectAtIndex:0]] autorelease]];
[dateFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss ZZZ"];
NSString *todayGregorian = [[dateFormat stringFromDate:[NSDate date]] retain];
[dateFormat release];

NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateFormat:@"yyyy-MM-dd HH:mm:ss ZZZ"];
[nsRequest setPredicate:[NSPredicate predicateWithFormat:@"publish <= %@ AND expires >= %@", [df dateFromString:todayGregorian], [df dateFromString:todayGregorian]]];

但是我希望也许我是个白痴,而且还有更好的方法。有什么建议?

请注意:

  • 要求我的日本用户改变 他们使用的日期格式不是 选项。
  • 另外,我还需要存储 核心数据以格里高利时期为准 格式,这些用户有时会这样做 把他们的日历改回来 类推。

真正的问题 我上面的解决方案是错的。 TechZen的回答引起了我的注意,我希望我可以投票100次,我最终解决了这个问题。

我的问题是服务器在GMT中发送进入核心数据的数据,并且格式化程序解析数据可能不一定是GMT,因此我需要调整正确进入核心数据的时间。

1 个答案:

答案 0 :(得分:2)

您真的别无选择,只能将NSDate转换为各种日历,特别是如果您的用户使用多个日历。

日历对象本身不是日期,而是专门的格式化程序。所有日期实际上都以GMT标准格式存储,无论它们来自哪个日历。然后根据需要将它们翻译/格式化为适当的日历。我们不会立即在针对西方人的应用中看到这一点,因为当代西方日历基于GMT,因此不需要翻译。

日期和时间编程看似复杂。我们并不直觉觉得它很复杂,因为通常会为我们处理这么多繁重的工作。但是,当你开始做一些不寻常的事情时,复杂性因为显而易见。

根据经验,担心数据和时间编程的时间不是代码看起来很复杂但是看起来很简单的时候。