4

以下の Utility メソッドを使用して、経過した秒、分、時間などを表示します。

例: 1 時間前

私たちの iPhone アプリケーションを海外でテストしている友人がいて、彼らがアイテムを送信するたびに、メソッドは常に「1 時間前」を返します。これは、ニュージーランドが 2 時間進んでおり、サーバーがオーストラリアでホストされているため、明らかに 2 時間遅れているためです。

SQL Server が追いつくまでのことです。アイテムの日付が正しく計算され始めたとき。

タイム ゾーンの違いを処理し、ユーティリティ メソッドを変更してグローバルに動作させるにはどうすればよいでしょうか? コードの行数がそれほど多くならないように、メソッドを自由に変更してください (本当に退屈で気前が悪い場合)。

前もって感謝します。

+ (NSString *)elapsedTime:(NSDate *)date {
    NSUInteger desiredComponents = NSYearCalendarUnit | NSMonthCalendarUnit | NSWeekCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;

    NSDateComponents *elapsedTimeUnits = [[NSCalendar currentCalendar] components:desiredComponents
                                                                         fromDate:date
                                                                           toDate:[NSDate date]
                                                                          options:0];

    // Format to be used to generate string to display.
    NSString *scannedFormat = @"%d %@ ago";
    NSInteger number = 0;
    NSString *unit;

    if ([elapsedTimeUnits year] > 0) {
        number = [elapsedTimeUnits year];
        unit = [NSString stringWithFormat:@"year"];
    } else if ([elapsedTimeUnits month] > 0) {
        number = [elapsedTimeUnits month];
        unit = [NSString stringWithFormat:@"month"];
    } else if ([elapsedTimeUnits week] > 0) {
        number = [elapsedTimeUnits week];
        unit = [NSString stringWithFormat:@"week"];
    } else if ([elapsedTimeUnits day] > 0) {
        number = [elapsedTimeUnits day];
        unit = [NSString stringWithFormat:@"day"];
    } else if ([elapsedTimeUnits hour] > 0) {
        number = [elapsedTimeUnits hour];
        unit = [NSString stringWithFormat:@"hour"];
    } else if ([elapsedTimeUnits minute] > 0) {
        number = [elapsedTimeUnits minute];
        unit = [NSString stringWithFormat:@"minute"];
    } else if ([elapsedTimeUnits second] > 0) {
        number = [elapsedTimeUnits second];
        unit = [NSString stringWithFormat:@"second"];
    } else {
        number = 1;
        unit = @"second";
    }

    // Check if unit number is greater than 1, then append 's' at the end.
    if (number > 1) {
        unit = [NSString stringWithFormat:@"%@s", unit];
    }

    // Resultant string required.
    NSString *scannedString = [NSString stringWithFormat:scannedFormat, number, unit];

    return scannedString;
}
4

1 に答える 1

7

iPhoneが現在使用しているタイムゾーンを取得するには、を使用する必要があり[NSTimeZone localTimeZone]ます。次に、現地時間とサーバー時間の差を処理す​​る必要があります。最も安全なオプションは、おそらくすべての時間を内部でGMTに変換し(特にサーバーに時刻を送信する場合)、ユーザーに時刻を表示するときに現地時間に変換することです。

また、「サーバー時間」を参照タイムゾーンとして使用し、アプリがそのタイムゾーンを認識していることを確認して(サーバーにクエリを実行するか、アプリにハードワイヤリングすることで)、すべての時間値を「サーバー時間」に変換することもできます。 「内部的には...しかし、サーバーがタイムゾーンを変更した場合に問題が発生したり、サーバーがDaylightSavingsTimeを開始および終了したときに1時間ごとに問題が発生したりする可能性があります。

サーバーに書き込むデータの一部としてタイムゾーンを保存することもできますが、実際にはそれは避けられないことです。遅かれ早かれ、これらの時間を参照タイムゾーンに変換して、計算できるようにする必要があります。経過時間。

于 2011-05-06T14:45:54.153 に答える