2017-02-15 12 views
0

Objective-cを使用して開発された既存のiOSアプリケーションで問題が発生しました。RFC 3339日付フォーマッタ - 出力日が1日シフトするのはなぜですか?

問題:出力日がPSTタイムゾーンの場合のみ、1日前にシフトしています。

日付を短い形式に変換するコードを以下に示します。

-(NSString *)getDisplayDateFormat:(NSString *)dateString 
{ 
    NSLocale *enUSPOSIXLocale; 
    NSDateFormatter *inputformatter = [[NSDateFormatter alloc] init]; 
    enUSPOSIXLocale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"]; 
    [inputformatter setLocale:enUSPOSIXLocale]; 
    inputformatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0]; 
    [inputformatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssSSSZZZZ"]; 
    NSDate *date= [inputformatter dateFromString:dateString]; 
    NSDateFormatter *OutPutformatter = [[NSDateFormatter alloc] init]; 
    [OutPutformatter setDateFormat:@"yyyy-MM-dd"]; 
    NSString *dispalyDateString = [OutPutformatter stringFromDate:date]; 
    return dispalyDateString; 
} 

入力日付ストリング= 2017-01-16T00:00:00-06:00

UTCフォーマット:日付= 2017年1月16日午前6時00分00秒0000

出力日付ストリング= 2017-01-15

問題の修正にご協力ください。

+0

間違っていません。あなたが見ているものは期待されます。そしてそれはPST(米国の西海岸)だけではありません。 -6より大きいタイムゾーンオフセット(さらに西方向)のデバイスでは、1月15日が表示されます。 – rmaddy

+0

2017-01-16T00:00:00-06:00(例えば、シカゴの1月16日の深夜)は、1月15日にロサンゼルスで午後10時でした。あなたの出力は理にかなっています。問題は、あなたのより広い目的が何であるかです。あなたは何かが起こった時は気にしないと言っていますか?次に、あなたの日付文字列に時間部分を含めないでください。ステップバイステップでは、より広い設計目標を記述するために質問を編集し、それに対処する方法をアドバイスすることができます。 – Rob

+0

説明していただきありがとうございます。サーバーから2017-01-16T00:00:00-06:00の日付を取得中です。2017-01-16に変換する必要があります。親切に提案してください。 – Raj

答えて

-1

誰が本当に何時ですか?これを試してみてください:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    NSString *d = @"2017-01-16T00:00:00-06:00"; 

    NSArray *abbrevs = @[@"UTC", @"EDT", @"PST", @"HST", @"JST"]; 

    NSArray *names = @[@"UTC", @"America/New York", @"America/Los Angeles", @"Pacific/Honolulu", @"Asia/Japan"]; 

    for (int n = 0; n < abbrevs.count; n++) { 

     NSString *na = abbrevs[n]; 
     NSString *nm = names[n]; 
     NSString *r = [self getDisplayDateFormat:d inTimeZone:[NSTimeZone timeZoneWithAbbreviation:na]]; 

     NSLog(@"Time is %@ in %@ (%@)", r, nm, na); 

    } 
} 

-(NSString *)getDisplayDateFormat:(NSString *)dateString inTimeZone:(NSTimeZone*)tz 
{ 
    NSLocale *enUSPOSIXLocale; 
    NSDateFormatter *inputformatter = [[NSDateFormatter alloc] init]; 
    enUSPOSIXLocale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"]; 
    [inputformatter setLocale:enUSPOSIXLocale]; 
    inputformatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0]; 
    [inputformatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssSSSZZZZ"]; 
    NSDate *date= [inputformatter dateFromString:dateString]; 
    NSDateFormatter *OutPutformatter = [[NSDateFormatter alloc] init]; 
    //[OutPutformatter setDateFormat:@"yyyy-MM-dd"]; 
    // show the time also, for clarity 
    [OutPutformatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; 
    // This is important! You must set the TimeZone for the output string - otherwise you get the local/device timezone 
    OutPutformatter.timeZone = tz; 
    NSString *dispalyDateString = [OutPutformatter stringFromDate:date]; 
    return dispalyDateString; 
} 
+0

だから、私はここに投稿するのが比較的新しいです。なぜ誰かがこの回答に投票するのが好奇心ですか? – DonMag

+0

私はダウン投票しませんでしたが、これはOPの質問を解決するものではないため、おそらくダウン投票されました。彼はいくつかのISO8601文字列を持っていて、日付コンポーネントが何であるかを知りたいと思っています。彼は地元の時間帯で日付を見たくない。それはあなたがここで単純に再現したオリジナルコードの問題です。 – Rob

+0

コメントありがとう、Rob。実際の*日付*と日付*の提示方法*は2つの独立したものであると私はOPに伝えようとしていました。おそらく、私が説明的なコードを提供するのではなく、単純な言語で説明していれば、より良いアプローチになっていたでしょう。 – DonMag

0

あなたが日時文字列の日付部分の文字列表現をキャプチャしたい場合は、関係なく使用するローカルタイムゾーンは、独自異なっていたかどうかの、最も簡単な方法は、すべてを無視することです時刻とタイムゾーンの情報を取得し、日付部分を取得するだけです。最も単純な形式では、あなたができる:あなたは本当に(場合には、ユーザはグレゴリオ暦を使用していない)デバイスのロケールに変換することを意図している場合、

- (NSString *)getDisplayDateFormat:(NSString *)dateString { 
    return [dateString substringToIndex:10]; 
} 

をそれとも、あなたはどうなる:

- (NSString *)getDisplayDateFormat:(NSString *)dateString { 
    NSDateFormatter *inputFormatter = [[NSDateFormatter alloc] init]; 
    NSLocale *enUSPOSIXLocale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"]; 
    [inputFormatter setLocale:enUSPOSIXLocale]; 
    [inputFormatter setDateFormat:@"yyyy-MM-dd"]; 
    NSDate *date = [inputFormatter dateFromString:[dateString substringToIndex:10]]; 
    NSDateFormatter *outputFormatter = [[NSDateFormatter alloc] init]; 
    [outputFormatter setDateFormat:@"yyyy-MM-dd"]; 
    return [outputFormatter stringFromDate:date]; 
} 

さらに、ユーザーのカレンダーに変換しようとしていた場合は、おそらくyyyy-MM-dd形式を使用しないで、ユーザーフレンドリーなdateStyleを使用します。

関連する問題