0

作業中のアプリで UNIX タイムスタンプ (1970 年以降) を生成できるようにする必要があるため、実験を試みました。

NSLog(@"Getting timeIntervalSince1970");
    double theLoggedInTokenTimestampDateEpochSeconds = [[NSDate date] timeIntervalSince1970];

これ、エポック秒 (1970 年以降) を GMT (1970 年 1 月 1 日以降の秒数) で返す必要があります。ただし、2011 年 8 月 15 日月曜日 09:54:30 に実験を行うと、1313427270.504315 が返されました。

Mac OS ターミナルで単純な perl ワンライナーを使用してこれをテストすると、次のようになり ます。 Mon Aug 15 09:54:30 2011 ...perl -e 'print scalar(localtime(1313427270))'を返します

私がSFベイエリアにいて、ローカルタイムゾーンが「クパチーノ」に設定されている場合、これは明らかにGMT時間ではありません. 何が起こっていますか、どうすれば修正できますか? アプリが通信するときに UTC 時間をサーバーに送信する必要があるため、ユーザーがどこにいてもタイムスタンプが同じ有効なタイムゾーンで送信されます。

私のアプリの別の部分では、ユーザーがサーバーからデータを要求すると、UTC で送信され、次のように表示されるように変換されます。

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setLocale:[NSLocale currentLocale]];
    [dateFormatter setTimeZone:nil];
    [dateFormatter setDateFormat:@"yyyyMMdd"];
    NSDate *conversationDate = [NSDate dateWithTimeIntervalSince1970:[theConversationTimeStampString intValue]];
    NSString *conversationDateString = [dateFormatter stringFromDate:conversationDate];
    [dateFormatter release];

これは美しく機能します-ユーザーのタイムゾーンとロケールで修正された時間を表示します...したがって、着信タイムスタンプに対して実行されていることがわかります。では、最初の関数 (timeIntervalSince190) が GMT にならないようにするために何が間違っているのでしょうか?

どうも

4

1 に答える 1

4

最初の関数は、表面的にはそう見えるかもしれませんが、実際には間違っているとは思いません。timeIntervalSince1970 から受信している時間間隔は、GMT の時間間隔を返しません。むしろ、現在から 1970 年 1 月 1 日 00:00:00 GMT までの時間間隔を返しています。これはつまらないことのように思えるかもしれませんが、重要です。間隔の値は、特定の時点からのスカラー秒数にすぎません。間隔自体は GMT ではなく、固定基準点のみです。

perl はわかりませんが、現地時間に関するドキュメントを簡単に検索したところ、標準の日付型を現地時間に変換するのに時間がかかるようです。つまり、固定された時点を表す時間間隔は、その時点での現地時間に変換されます。コマンドラインから表示すると、ローカル時刻が再び取得されます。したがって、絶対時間があなたの現地時間に変換されるのを見ることは、私が期待するものです.

サービスが UTC 時刻をどの程度正確に受け取るかによって、時間間隔の値は問題なく機能する可能性があります。ターミナルチェック以外に基づいていないという証拠はありますか?

于 2011-08-15T18:16:25.327 に答える