2012-04-12 11 views
1

で、私はこのコードの問題を抱えていることは:NSDate NSCalendarのdateFromComponent

+ (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; 
    } 
} 

それは私のコンソールに私が

2012-04-12午後02時34分を持っている...間違った開始日を生成します。 46.456 iFood Pro [23820:fb03]レポートをデータベースに保存 2012-04-12 14:34:46.458 iFood Pro [23820:fb03]適用日:2012-04-12 12:34:41 +0000 2012-04-12 12 14:34:46.458 iFood Pro [23820:fb03]開始日:2012-04-11 22:00:00 +0000 2012-04-12 14:34:46.459 iFood Pro [23820:fb03]終了日:2012 -04-12 21:59:59 +0000

開始日は、2012-04-11 22:00:00 +0000の代わりに2012-04-12 00:00:00 +0000にする必要があります。 この現象はなぜ発生しますか?私は心配しています!固定

+0

が固定解決、問題は時間帯だった... [部品はsetTimeZone:[NSTimeZone timeZoneWithAbbreviation: "UTC"] @]を使用しました。 は問題を解決します – Progeny

+0

私は正しい答えとして自分のコメントを受け入れることができますか? – Progeny

+0

あなたの質問に回答を追加してください(別のコメントと、コメントに自動変換されないように十分に長くてください)。コメントを受け入れることはできません。 –

答えて

1

、問題は時間帯だった... using [parts setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];が問題