创建没有时间元素的日期的NSDate最佳实践

Sim*_*onB 8 iphone core-data

我正在编写一个使用核心数据来存储我的数据的应用程序.其中包括一个日期字段,我只对日期而不是时间感兴趣.我需要根据日期(而不是时间)选择记录,因此我在NSDate上创建了一个类别以返回日期,标准化为设定时间,如下所示:

+ (NSDate *)dateWithNoTime:(NSDate *)dateTime {
if( dateTime == nil ) {
    dateTime = [NSDate date];
}
NSDateComponents* comps = [[NSCalendar currentCalendar] components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:dateTime];
NSDate *dateOnly = [[NSCalendar currentCalendar] dateFromComponents:comps];
[dateOnly dateByAddingTimeInterval:(60.0 * 60.0 * 12.0)];           // Push to Middle of day.
return dateOnly;
Run Code Online (Sandbox Code Playgroud)

}

然后我在将数据添加到核心数据存储时使用它(我有一个使用此方法设置原始日期值的setter)然后我使用此方法创建一个日期,用于比较执行日期时的日期获取请求.因此理论上这应该总是有效 - 即挑出我正在寻找的日期.

我有点紧张,因为我不完全确定改变时区或地区会有什么影响.它还能用吗?

仅当您对时间不感兴趣时​​,在日期存储和搜索时,最佳做法是什么.

干杯.

编辑

阅读推荐的讨论后,我认为我应该修改我的代码如下.我的想法是,如果我确保将其推送到特定日历系统和特定时区(UTC),则无论您在设置日期和阅读日期时的位置,日期都应始终相同.对此新代码的任何评论都表示赞赏.

+ (NSDate *)dateWithNoTime:(NSDate *)dateTime {
if( dateTime == nil ) {
    dateTime = [NSDate date];
}

NSCalendar       *calendar   = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
[calendar setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
NSDateComponents *components = [[[NSDateComponents alloc] init] autorelease];
components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit
                         fromDate:dateTime];

NSDate *dateOnly = [calendar dateFromComponents:components];

[dateOnly dateByAddingTimeInterval:(60.0 * 60.0 * 12.0)];           // Push to Middle of day.
return dateOnly;
Run Code Online (Sandbox Code Playgroud)

}

小智 5

你有几个问题要处理.首先,正如您所说,时区.您还需要担心夏令时,这会改变"正午"的概念.

看一下关于CocoaDev的讨论,Apple Engineer给出了一些答案并讨论了一些最佳实践.