Пиша приложение, което използва основни данни, за да съхранява моите данни. В това е включено поле за дата, от което се интересувам само от датата, а не от часа. Трябва да избера записи въз основа на датата (не часа) и затова създадох категория в 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;
}
След това използвам това, когато добавям данни към основното хранилище на данни (имам сетер, който използва този метод, за да зададе примитивната стойност на датата) и след това използвам този метод, за да създам дата, която използвам за сравняване на датите, когато извършвам заявка за извличане. Така че на теория това винаги трябва да работи - т.е. избирам датите, които търся.
Въпреки това съм малко нервен, тъй като не съм напълно сигурен какъв ефект ще има промяната на часовата зона или локала. Ще работи ли все пак?
Какво се счита за най-добра практика при съхраняване и търсене на дата само когато не се интересувате от часа.
наздраве
РЕДАКТИРАНЕ
След като прочетох препоръчаната дискусия, мисля, че трябва да променя кода си, за да бъде както следва. Мисълта е, че ако се уверя, че го насочвам към конкретна календарна система и конкретна часова зона (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;
}
[dateOnly dateByAddingTimeInterval:(60.0 * 60.0 * 12.0)];
Трябва да бъде:dateOnly = [dateOnly dateByAddingTimeInterval:(60.0 * 60.0 * 12.0)];
- person Leonardo Bortolotti   schedule 02.03.2016