AlexWienが受け入れた回答は正しくありません。
デフォルトでは、NSDateFormatterはNSDateの日時値をUTCからユーザーのローカルタイムゾーンに調整します。この調整を防ぐには、NSDateFormatterにのタイムゾーンを使用するように指示しますUTC
。
結果を確認するには、「currenttimeutc」をグーグルで検索してください。
以下の私のソースコードはその仕事をするはずです。つまり、現在の日時を、末尾にaで示されるUTC(Zulu)タイムゾーンのISO8601形式の文字列として取得します。Z
NSDate* datetime = [NSDate date];
NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]]; // Prevent adjustment to user's local time zone.
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"];
NSString* dateTimeInIsoFormatForZuluTimeZone = [dateFormatter stringFromDate:datetime];
このロジックは、アプリのどこかにある便利なメソッドのペアに入れることができます。
- (NSString*)now
{
// Purpose: Return a string of the current date-time in UTC (Zulu) time zone in ISO 8601 format.
return [self toStringFromDateTime:[NSDate date]];
}
…そして…</p>
- (NSString*)toStringFromDateTime:(NSDate*)datetime
{
// Purpose: Return a string of the specified date-time in UTC (Zulu) time zone in ISO 8601 format.
// Example: 2013-10-25T06:59:43.431Z
NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"];
NSString* dateTimeInIsoFormatForZuluTimeZone = [dateFormatter stringFromDate:datetime];
return dateTimeInIsoFormatForZuluTimeZone;
}
使用例…</p>
NSString* now = [self now];
または、これらのマイナス記号をプラス記号に変換して、インスタンスメソッドではなくクラスメソッドとして使用します…</ p>
NSString* now = [SomeClassNameHere now];
ヒント:人間が読みやすくするためT
に、形式をスペースに変更してください。ソフトウェアによる相互運用性を高めるために、を保持しT
ます。ISO 8601仕様はスペースを許容しますが、を維持することをお勧めしT
ます。
ヒント:テストはしていませんが…インスタンス化には費用がかかると言う人もいます[NSDateFormatter][4]
。頻繁に行う場合(ループ内など)は、再利用のために単一のインスタンスをキャッシュすることを検討してください。