2016-08-10 4 views
0

サーバーから次の日付を取得していますstringです。NSDateformatterのタイムゾーンが間違っています

"Fri, 09 Sep 2016 16:50:40 GMT" 

私はこれがtimezone私の地元に変換したい、と私はそれを行うには、この方法があります:

-(NSString *)convertDatetoLocalTimeZone:(NSString *)dateString { 

    NSDateFormatter *serverFormatter = [[NSDateFormatter alloc] init]; 
    [serverFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]]; 
    [serverFormatter setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss zzz"]; 

    NSDate *expDate = [serverFormatter dateFromString:dateString]; 

    NSDateFormatter *userFormatter = [[NSDateFormatter alloc] init]; 
    [userFormatter setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss zzz"]; 
    [userFormatter setTimeZone:[NSTimeZone systemTimeZone]]; 

    return [userFormatter stringFromDate:expDate]; 

} 

を、今変換された日付は、次のとおりです。

"Fri, 09 Sep 2016 12:50:40 EDT" 

として、これは文字列です。NSDate(OfCourseと同じタイムゾーン)に変換します。変換されたNSDateには、EDTのタイムゾーンが表示されます。ここで

は、私は戻ってNSDateに文字列を変換しなければならないものである:

-(NSDate *)getDateFromString:(NSString*)dateString{ 

    NSDateFormatter *df = [[NSDateFormatter alloc] init]; 
    [df setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss zzz"]; 
    [df setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"EDT"]]; //I also tried [NSTimeZone systemTimeZone] 
    return [df dateFromString:dateString]; 

} 

返される日付は次のとおりです。

2016-09-09 16:50:40 +0000 //this is in UTC 

私もen_US

私にロケールを設定することで、試してみました私がタイムゾーンをに設定しても、日付フォーマッタがEDTUTCに変換するのはなぜですか?

答えて

0

変換されたNSDateがEDTタイムゾーンを表示することが期待されます。

これは問題です。 NSDateにタイムゾーンがありません。 NSDateのインスタンスは、特定の瞬間を表します。それは、特定の場所、特定の瞬間の特定の瞬間を意味するものではありません。

NSDateを印刷すると、日付のUTC表現が表示されます。これは、日付がUTCであることを意味するものではなく、印刷時にUTCのみが使用されたことを意味します。

この結果、convertDatetoLocalTimeZoneメソッドは既に有効なNSDateを取得しています。メソッドの結果を既に計算しているので、別のgetDateFromStringメソッドは必要ありません。 NSDateの値を格納し、必要に応じて文字列として変換し、文字列として保存してNSDateに変換するのではなく、常に文字列に変換する方が良いでしょう。日付をconvertDatetoLocalTimeZoneに保存し、文字列を保存せずに後でNSDateに変換し直してください。

関連する問題