NSDateFormatter not working to set setTimeZone

2019-03-05 23:35发布

问题:

I am trying to know the difference between two dates (Including days,hours,minutes and seconds). For that I am using below code, but It's not working.

+ (void)UpdateTableViewCellWithNSTimer:(NSString *)gameTime :(UIView *)inputView{        
    NSDate *now = [NSDate date];
    NSDateFormatter *outputFormatter = [[NSDateFormatter alloc] init];
    [outputFormatter setLocale:[NSLocale systemLocale]];
    [outputFormatter setAMSymbol:@"AM"];
    [outputFormatter setPMSymbol:@"PM"];
    [outputFormatter setTimeZone:[NSTimeZone localTimeZone]];
    [outputFormatter setDateFormat:@"mm/dd/yyyy hh:mm a"];
    NSDate *gameDate = [outputFormatter dateFromString:gameTime];
    NSCalendar *gregorian = [[NSCalendar alloc]                             initWithCalendarIdentifier:NSGregorianCalendar];
    NSUInteger unitFlags = NSMonthCalendarUnit | NSDayCalendarUnit|NSHourCalendarUnit|NSMinuteCalendarUnit|NSSecondCalendarUnit;
    NSDateComponents *components = [gregorian components:unitFlags                                                fromDate:gameDate toDate:now options:0];
    NSInteger days = [components day];
    NSInteger hours = [components hour];
    NSInteger seconds = [components second];
    NSInteger minutes = [components minute];

    UITableView *dynamicTable = (UITableView *)[inputView viewWithTag:55];
    NSIndexPath *cellIndexPath = [NSIndexPath indexPathForRow:4 inSection:0];
    UITableViewCell *currentCell = [dynamicTable cellForRowAtIndexPath:cellIndexPath];
    NSString *challengeStartsIn=[NSString stringWithFormat:@"%01ddays:%02dhrs:%02dmins:%02dsec",abs(days),abs(hours), abs(minutes), abs(seconds)];
    NSString *Mystring =[NSString stringWithFormat:@"%@        %@", @"ChallengeStartsIn", challengeStartsIn];
    currentCell.textLabel.text = Mystring;
}
**Game and now dates on logs are:**

2013-05-18 11:36:42.609 FPPresent[2213:5203] gametime value=05/19/2013 5:30 AM
2013-05-18 11:36:42.610 FPPresent[2213:5203] now=2013-05-18 06:06:42 +0000

After using outputformatter:

 gametime value =2013-01-19 00:00:00 +0000(It should be 2013-01-19 05:30:00 +0000 )
 now=2013-05-18 06:10:07 +0000(should be : 2013-05-18 11:40:07 +0000)

The game date and now date should in localTimeZone. But, even I try to set

[outputFormatter setTimeZone:[NSTimeZone localTimeZone]];

My data format is showing (Exactly 5.30 hours different, our local time zone is GMT+5.30)

Please let me know where I am going wrong

回答1:

[NSDate date] is taking default timezone as GMT. so, I am unable to set my local timezone to date.

While knowing the difference between GMT OFFset to local , I am able to get the difference between two dates sucessfully.

NSDate* sourceDate = [NSDate date];
    NSTimeZone* sourceTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
    NSTimeZone* destinationTimeZone = [NSTimeZone systemTimeZone];
    NSInteger sourceGMTOffset = [sourceTimeZone secondsFromGMTForDate:sourceDate];
    NSInteger destinationGMTOffset = [destinationTimeZone secondsFromGMTForDate:sourceDate];
    NSTimeInterval interval = destinationGMTOffset - sourceGMTOffset;
    NSDate* destinationDate = [[NSDate alloc] initWithTimeInterval:interval sinceDate:sourceDate];
    NSDateFormatter *outputFormatter = [[NSDateFormatter alloc] init];
    [outputFormatter setAMSymbol:@"AM"];
    [outputFormatter setPMSymbol:@"PM"];
    [outputFormatter setLocale:[NSLocale currentLocale]];
    [outputFormatter setDateFormat:@"MM/dd/yyyy hh:mm a"];

 NSDate *gameDate = [outputFormatter dateFromString:gameTime];
 NSDate* gameDestinationDate = [[NSDate alloc] initWithTimeInterval:interval sinceDate:gameDate];
//    NSLog(@"gameDate=%@",gameDate);
NSCalendar *gregorian = [[NSCalendar alloc]                 initWithCalendarIdentifier:NSGregorianCalendar];
NSUInteger unitFlags = NSMonthCalendarUnit | NSDayCalendarUnit|NSHourCalendarUnit|NSMinuteCalendarUnit|NSSecondCalendarUnit;
NSDateComponents *components = [gregorian components:unitFlags                           fromDate:destinationDate toDate:gameDestinationDate options:0];
NSInteger days = [components day];
NSInteger hours = [components hour];
NSInteger seconds = [components second];
NSInteger minutes = [components minute];

return ([NSString stringWithFormat:@"%01ddays:%02dhrs:%02dmins:%02dsec",abs(days),abs(hours), abs(minutes), abs(seconds)]);


回答2:

Are you setting the timeZone for the output formatter and along with that are you adding the time difference to the output date?? Because, there is not need to add the time difference as setting timezone for both dateFormatters will automatically take care of the time difference between the time zones.