0

2 つの日付 (日、時間、分、秒を含む) の違いを知りたいと思っています。そのために、以下のコードを使用していますが、機能していません。

+ (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 です)

どこが間違っているのか教えてください

4

2 に答える 2

2

[NSDate date] はデフォルトのタイムゾーンを GMT としています。そのため、ローカル タイムゾーンを日付に設定できません。

GMT OFFset と local の違いを知りながら、2 つの日付の違いをうまく取得できました。

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)]);
于 2013-05-30T12:08:01.150 に答える
0

出力フォーマッタの timeZone を設定していますか?それに加えて、出力日付に時差を追加していますか?? 両方の dateFormatters にタイムゾーンを設定すると、タイムゾーン間の時差が自動的に処理されるため、時差を追加する必要はありません。

于 2013-05-22T11:17:59.973 に答える