NSDateFormatter无法设置setTimeZone

时间:2013-05-18 06:16:58

标签: iphone objective-c nsdateformatter

我想知道两个日期之间的区别(包括天,小时,分钟和秒)。为此,我使用下面的代码,但它不起作用。

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

使用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)

游戏日期和现在日期应该在localTimeZone中。但是,即使我尝试设置

[outputFormatter setTimeZone:[NSTimeZone localTimeZone]];

我的数据格式正在显示(完全相差5.30小时,我们的当地时区为GMT + 5.30)

请告诉我出错的地方

2 个答案:

答案 0 :(得分:2)

[NSDate date]将默认时区视为GMT。所以,我无法设置我当地的时区。

在了解GMT OFFset与本地之间的区别的同时,我能够成功地获得两个日期之间的差异。

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)]);

答案 1 :(得分:0)

您是否为输出格式化程序设置了timeZone,以及您是否将时间差添加到输出日期?因为,不需要添加时差,因为两个dateFormatters的设置时区将自动处理时区之间的时差。