3

次のコードを使用して、ユーザーのタイムゾーンで現在のNSDateを取得します

-(NSDate *)getCurrentDateinLocalTimeZone
{
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 *dateFormatter = [[NSDateFormatter alloc]init];
dateFormatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";

return   [dateFormatter dateFromString: [dateFormatter stringFromDate:destinationDate]];
}

アプリの他の時点で、UIの目的で日付を「HH:mm」としてフォーマットしたいので、次の方法を使用します

-(NSString *)formatDate:(NSDate *)date
{
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setTimeZone:[NSTimeZone systemTimeZone]];
dateFormatter.dateFormat = @"HH:mm";
return [dateFormatter stringFromDate:date]; 
}

2番目のメソッドの出力が1番目のメソッドの結果から3時間シフトした場合、、、時刻ではなくNSDateの形式のみを変更したいのですが、何が間違っているのでしょうか。

4

1 に答える 1

6

このgetCurrentDateinLocalTimeZoneメソッドは、タイムゾーンの日付を調整し、タイムゾーンを切り取るフォーマット文字列を使用してフォーマットし、フォーマットされた文字列を解析して戻します。結果NSDateはUTCタイムゾーンにあります(+0000in2012-07-15 16:28:23 +0000はUTC時間を示します)。このformatDate:メソッドはdateFormatter、ローカルタイムゾーンに設定されているを使用して、異なる時間を生成します。正しい時刻を取得するには、UTCを使用するようにフォーマッターを設定する必要があります。

[dateFormatter setTimeZone:[NSTimeZone systemTimeZone]];

[dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]];

formatDate:メソッドで。

于 2012-07-15T13:25:30.420 に答える