6

私は、Objective C でいくつかの日付/時刻データをマッサージすることを余儀なくされている、不適切にプログラムされたサードパーティ API を扱っています。

日付を UTC の絶対 UNIX タイム スタンプとして返​​す代わりに、タイム ゾーン情報を含まない書式設定された文字列として日付を返します。(開発者の 1 人に話を聞いたところ、実際には日付/時刻をタイムスタンプとしてではなく、タイム ゾーン情報のない文字列としてデータベースに保存していることがわかりました! ) サーバーは米国の中央のどこかにあります。現在CDTにあるので、理論的には、フォーマットされた日付に「CDT」を追加し、NSDateFormatter(yyyy-MM-dd HH:mm:ss zzz)を使用してNSDateを構築できます。ただし、問題の日付の時期によっては、CST または CDT の場合があります。

適切なタイムゾーンを追加して正しい UTC 日付を計算できるように、その特定の日付に夏時間が有効かどうかを判断するにはどうすればよいですか?

4

2 に答える 2

8

まあ、これを行う正しい方法ないと思います。これには、次のような API があります。

[NSTimeZone isDaylightSavingTimeForDate:][NSTimeZone daylightSavingTimeOffsetForDate:]

BUT CDTからCSTへの移行では、1時間が繰り返されるため、CDTかCSTかを知る方法はありません。その 1 時間以外は、CST を想定し、夏時間のチェックが機能するはずです。私の提案は、この API を書いた人に火をつけることです。

于 2013-05-30T01:21:22.527 に答える
0

私は解決策があると思います:

    NSString *originalDateString = <ORIGINAL DATE FROM API>;

    NSDateFormatter *dateStringFormatter = [[NSDateFormatter alloc] init];
    dateStringFormatter.dateFormat = @"yyyy-MM-dd HH:mm:ss zzz";

    NSString *tempDateString = [originalDateString stringByAppendingFormat:@" CST"];

    // create a temporary NSDate object
    NSDate *tempDate = [dateStringFormatter dateFromString:tempDateString];

    // get the time zone for this NSDate (it may be incorrect but it is an NSTimeZone object)
    NSDateComponents *components = [[NSCalendar currentCalendar]
                                    components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit | NSTimeZoneCalendarUnit
                                    fromDate:tempDate];
    NSTimeZone *tempTimeZone = [components timeZone];

    // Find out if the time zone of the temporary date
    // (in CST or CDT depending on the local time zone of the iOS device)
    // **would** use daylight savings time for the date in question, and
    // select the proper time zone
    NSString *timeZone;
    if ([tempTimeZone isDaylightSavingTimeForDate:tempDate]) {
        timeZone = @"CDT";
    } else {
        timeZone = @"CST";
    }

    NSString *finalDateString = [originalDateString stringByAppendingFormat:@" %@", timeZone];
于 2013-05-30T03:53:58.477 に答える