Search code examples
iosnsdatenscalendar

NSDate by NSCalendar's dateFromComponent


I'm having an issue with this code:

+ (NSDate *)dateByMovingToBeginningOfDay:(NSDate *)date
{
    unsigned int flags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;

    NSDateComponents* parts = [[NSCalendar currentCalendar] components:flags fromDate:date];
    [parts setHour:0];
    [parts setMinute:0];
    [parts setSecond:0];

    return [[NSCalendar currentCalendar] dateFromComponents:parts];
}

+ (NSDate *)dateByMovingToEndOfDay:(NSDate *)date
{
    unsigned int flags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;

    NSDateComponents *parts = [[NSCalendar currentCalendar] components:flags fromDate:date];
    [parts setHour:23];
    [parts setMinute:59];
    [parts setSecond:59];

    return [[NSCalendar currentCalendar] dateFromComponents:parts];
}

+ (BOOL)checkForReportInDate:(NSDate *)date forUser:(User *)user
{
    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    NSManagedObjectContext *context = appDelegate.managedObjectContext;

    NSDate *startDate = [NSDate dateByMovingToBeginningOfDay:date];
    NSDate *endDate = [NSDate dateByMovingToEndOfDay:date];

    NSLog(@"apply date: %@", date.description);
    NSLog(@"start date: %@", startDate.description);
    NSLog(@"end date: %@", endDate.description);

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    fetchRequest.entity = [NSEntityDescription entityForName:@"Report" inManagedObjectContext:context];
    fetchRequest.predicate = [NSPredicate predicateWithFormat:@"user == %@ AND (date > %@ AND date < %@)", user, startDate, endDate];
    fetchRequest.fetchLimit = 1;

    NSError *error = nil;

    NSUInteger reportExist = [context countForFetchRequest:fetchRequest error:&error];

    if(error != nil) {
        NSLog(@"Error: %@", [error localizedDescription]);
        return NO;
    }

    if(reportExist > 0) {
        return 1;
    }
    else {
        return 0;
    }
}

It generates wrong start date... in my console I have

2012-04-12 14:34:46.456 iFood Pro[23820:fb03] Save Report to Database 2012-04-12 14:34:46.458 iFood Pro[23820:fb03] apply date: 2012-04-12 12:34:41 +0000 2012-04-12 14:34:46.458 iFood Pro[23820:fb03] start date: 2012-04-11 22:00:00 +0000 2012-04-12 14:34:46.459 iFood Pro[23820:fb03] end date: 2012-04-12 21:59:59 +0000

start date should be 2012-04-12 00:00:00 +0000 instead of 2012-04-11 22:00:00 +0000 Why of this behavior? I'm getting out of mind!


Solution

  • fixed, the problem was the timezone... using [parts setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]]; solves the issue