0

時間文字列をあるタイムゾーンから NSDate オブジェクトに変換し、ローカル タイムゾーンを使用して文字列に出力しようとしています。しかし、私は1時間外出しているようです。例として、エラーを表示できるように出力タイムゾーンを追加しました。同様の質問がいくつかありますが、これでどこが間違っているのかについてのヒントは何もありません!!! これを投稿した時点では、どちらのタイムゾーンも現在夏時間になっていますが、NSDateFormatter はタイムゾーンに基づいて違いを処理する必要があります。

更新:問題は、BST ではなく、LA 時間を GMT に変換することにあるようです。私の知る限り、すべての NSDate は GMT として保存されます。以下のコードはこれを示しています (ロケールが追加されています - 違いはないようです):

NSDateFormatter *dateF = [[NSDateFormatter alloc] init];
[dateF setDateFormat:@"HH:mm"];
[dateF setTimeZone:[NSTimeZone timeZoneWithName:@"America/Los_Angeles"]];
[dateF setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]];
NSDate* sourceDate = [dateF dateFromString:@"09:15"];

NSLog(@"Date GMT: %@", [sourceDate description]);
NSLog(@"Date BST: %@", [sourceDate descriptionWithLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_GB"]]);

出力:

日付 GMT: 1970-01-01 17:15:00 +0000これは正しくありません!

日付 BST: 1970 年 1 月 1 日木曜日 18:15:00 GMT+01:00したがって、これも正しくありません

元の例

LA の 09:15 は、18:15 ではなく、ロンドンでは 17:15 のはずです...

NSDateFormatter *dateF = [[NSDateFormatter alloc] init];
[dateF setDateFormat:@"HH:mm"];
[dateF setTimeZone:[NSTimeZone timeZoneWithName:@"America/Los_Angeles"]];

NSDate* sourceDate = [dateF dateFromString:@"09:15"];

NSDateFormatter *dateformatter = [[NSDateFormatter alloc] init];
[dateformatter setDateFormat:@"HH:mm"];
[dateformatter setTimeZone:[NSTimeZone timeZoneWithName:@"Europe/London"]];
NSLog(@"%@", [dateformatter stringFromDate:sourceDate]);
4

2 に答える 2

0

NSDate オブジェクトは日付を絶対時間で保存します。たとえば、リスト 16 で作成された日付オブジェクトは、CDT の午後 4:00、EDT の 5:00 などを表します。

NSCalendar *gregorian=[[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar];
[gregorian setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"CDT"]];
NSDateComponents *timeZoneComps=[[NSDateComponents alloc] init];
[timeZoneComps setHour:16];
//specify whatever day, month, and year is appropriate
NSDate `enter code here`*date=[gregorian dateFromComponents:timeZoneComps];
于 2012-07-17T16:56:52.310 に答える