3

特定のタイムゾーン(必ずしもシステムと同じタイムゾーンである必要はありません)を使用してUnixタイムスタンプを取得しようとしています

私はこれを試しました:

 NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

NSTimeZone *gmt = [NSTimeZone timeZoneWithName:@"Australia/Melbourne"];
[dateFormatter setTimeZone:gmt];
NSString *timeStamp = [dateFormatter stringFromDate:[NSDate date]];
NSDate *curdate = [dateFormatter dateFromString:timeStamp];

int unix_timestamp =  [curdate timeIntervalSince1970];

これは明らかに、オーストラリアのUnixタイムスタンプ(最大秒)を与えるはずです。ただし、ログに記録するcurdateと、それでもGMTtimeStampの時刻であり、オーストラリア/メルボルンの時刻です。

ここでの問題は何でしょうか?

4

2 に答える 2

6

このメソッドtimeIntervalSince1970は、1970年1月1日の午前0時からの秒数をGMT時間で返します。

1970年1月1日午前0時のメルボルン時間からの秒数が必要な場合は、1970年1月1日のGMTメルボルンからのオフセットを決定する必要があります。

そのために、NSTimeZoneインスタンスを使用できます

   NSDate* referenceDate = [NSDate dateWithTimeIntervalSince1970: 0];
   NSTimeZone* timeZone = [NSTimeZone timeZoneWithName:@"Australia/Melbourne"];
   int offset = [timeZone secondsFromGMTForDate: referenceDate];
   int melbourneTimestamp = unix_timestamp - offset;

または、最後の行をプラスオフセットにする必要があります。コードをテストして見てください。私は今Macを使用していません。


編集:以下のAyushのコメントを参照してください。オフセットは減算ではなく加算を目的としているようです

編集#2:ポスターとチャットした後、1970年以降のメルボルン時間のタイムスタンプはおそらく実際には必要ありませんでした。ほとんどのアプリケーションは、GMT以外のタイムゾーンでは、おそらくそのようなタイムスタンプを追跡する必要はありません。ユーザーに時間を表示する時間になったら、タイムゾーンに変換します。

于 2012-06-06T07:20:06.563 に答える
2
time_t unixTime = (time_t) [[NSDate date] timeIntervalSince1970];
于 2012-06-06T08:50:38.210 に答える