web-dev-qa-db-ja.com

時間をiPhoneデバイスのタイムゾーンに変換するにはどうすればよいですか?

私はESTタイムゾーンに時間を持っています、それはmysqlサーバーのNOW()関数を使用して行われます。私のサーバーはESTにあるため、保存される時間はESTにあります。 iPhoneのアプリから取得するときは、ユーザーの正しいタイムゾーンで表示する必要があります。それ、どうやったら出来るの?

20
erotsppa

ESTの意味によって異なると思います。米国東海岸を意味する場合、一般的にはUTCから5時間遅れており(夏時間は考慮されていません)、04:00ESTになります。略語はあいまいであるため、可能な限り使用しないようにしてください。 ESTは、America/DetroitとAustralia/Sydneyの両方の略語です。 NSTimeZone initWithNameを使用すると、より正確な結果が得られます。

Chronos Time Zone Repository は、タイムゾーンがどのように機能するかを理解するのに非常に役立つ、読みやすいXMLタイムゾーンデータベースを提供します(すべてかなり面倒で変更可能です)。

3
StephenT

//以下の関数を使用して、日付を希望のタイムゾーンに変換できます

+ (NSDate *) convertDate:(NSDate *) date toTimeZone:(NSString *) timeZoneAbbreviation {

    NSTimeZone *systemZone  = [NSTimeZone systemTimeZone];
    NSTimeZone *zoneUTC     = [NSTimeZone timeZoneWithAbbreviation:timeZoneAbbreviation];
    NSTimeInterval s        = [zoneUTC secondsFromGMT];

    NSTimeZone *myZone      = [NSTimeZone timeZoneWithAbbreviation:[systemZone abbreviationForDate:date]];
    NSTimeInterval p        = [myZone secondsFromGMT];

    NSTimeInterval i = s-p;
    NSDate *d = [NSDate dateWithTimeInterval:i sinceDate:date];

    return d;

}


//Test case **note** cgUtil is the class this method is written thus change it accordingly

__block NSDate *now = [NSDate date];
NSLog(@"Current time:%@", now);
[[[NSTimeZone abbreviationDictionary] allKeys] enumerateObjectsUsingBlock:^(NSString * abb, NSUInteger idx, BOOL *stop) {
    NSLog(@"Time zone abb:%@:Time:%@",abb,[cgUtil convertDate:now toTimeZone:abb]);
}];
3