-2

サーバーに GMT 形式で値を保存しています。それらをデバイスにダウンロードし、次の関数を使用してユーザーの現地時間に変換します。

- (void)convertTimeZone
{
    //Converts the match timing from GMT to the users local time
    NSString *serverDateString = [NSString stringWithFormat:@"%@-%@-%@ %@:%@ GMT", year, month, day, hour, min];

    NSDateFormatter *dateFormatter = [NSDateFormatter new];
    dateFormatter.dateFormat       = @"yyyy-MM-dd HH:mm zzz";

    NSDate *serverDate             = [dateFormatter dateFromString:serverDateString];

    NSString *localDateString      = [dateFormatter stringFromDate:serverDate];
    NSDate *localDate              = [dateFormatter dateFromString:localDateString];


    NSDateComponents *components = [[NSCalendar currentCalendar] components:NSHourCalendarUnit |NSMinuteCalendarUnit |NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate:localDate];

    min   = [NSString stringWithFormat:@"%d",[components minute]];
    hour  = [NSString stringWithFormat:@"%d",[components hour]];
    day   = [NSString stringWithFormat:@"%d",[components day]];
    month = [NSString stringWithFormat:@"%d",[components month]];
    year  = [NSString stringWithFormat:@"%d",[components year]];

}

ほとんどの人は、変換後に適切な時間を取得します。しかし、受け取った日付が 2001 年 1 月 1 日であると書いているユーザーはほとんどいません。これは、iOS と OSX の初期化日です。日付は、GMT と現地の日付との時差です。

これらの値は、年、月、日、時間、および分が適切に設定され、サーバーによって受信されます。他の値のいくつかが適切に表示されているため、私はそれを知っています。

ただし、この日時変換プロセスがうまくいかない場合はほとんどありません。

なぜそれが起こるのですか?

私のデバイスでは発生していませんが、他の国のユーザーには発生しているため、再現方法がわかりません。彼らはそれを再開しようとしましたが、まだ間違った日付を取得しています. ありがとう。

4

2 に答える 2

1

QA1480 に従って必要なロケールの設定に失敗しています。したがって、設定した日付形式は、ユーザーの設定に従って変更される場合があります。

問題を解決するには、ロケールを明示的に設定してください。

于 2013-08-21T16:02:36.007 に答える
1

を使用してNSDateFormatter、特定の特定の形式にする必要がある日付を読み取ったり出力したりする場合は、次のようにする必要があります。

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]];

これにより、ここに示すような問題が回避されます。

于 2013-08-21T16:03:54.763 に答える