NSDateを現在のUTCに設定するObjective-C


80

NSDate現在のUTC日付/時刻で初期化する簡単な方法はありますか?


1
うまくいくでしょう[NSDate date]か?UTCかどうかはわかりません。
zneak 2010

2
NSDateUTCに設定するようなものはなく、タイムゾーンが関連付けられていません。
ニックフォージ

3
@MurraySagalあなたは間違っています-NSDate瞬間を表します(名前NSDateは誤称です)。「2001年1月1日の最初の瞬間」などの時間を説明する場合、話している正確な瞬間を特定するためのタイムゾーンが必要ですが、NSDate作成されると、それに関連付けられたタイムゾーンはありません。
ニックフォージ

1
@NickForge NSDateは、特定のタイムゾーンの特定の時刻である「2001年1月1日の最初の瞬間、GMT」として作成されます。その事実は不変であり、日付が機能する理由にとって非常に重要です。異なるタイムゾーンにいて、これを同時に記録した場合NSLog(@"since1970= %f", [[NSDate date] timeIntervalSince1970]);、結果は同じです。どうして?これは、ユーザーがどこにいても、特定のタイムゾーン(GMT)の特定の時点を基準にしているためです。GMTに関連しているという事実は、作成された後は消えません。このアンカーがないと、日付は任意になります。
マレーサガル2013年

2
@MurraySagalどちらも正しい方法ですが、ニックは「NSDateUTCに設定するようなものはありません」と言った方が正しいです。なぜなら、のタイムゾーンを設定できないためNSDateです。 「タイムゾーンがあります」。特定のタイムゾーンに関連して定義されていることは事実ですが、タイムゾーンが「ある」とは、タイムゾーンがのプロパティであることを意味しNSDateます。これは正しくありません。
devios1 2013

回答:


148

[NSDate date];

次のようなことを行うカテゴリを作成することをお勧めします。

-(NSString *)getUTCFormateDate:(NSDate *)localDate
{
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"UTC"];
    [dateFormatter setTimeZone:timeZone];
    [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    NSString *dateString = [dateFormatter stringFromDate:localDate];
    [dateFormatter release];
    return dateString;
}

2
NSTimeZone * timeZone = [NSTimeZone timeZoneWithName:@ "UTC"]; [dateFormatter setTimeZone:timeZone]; それは感謝を釘付けにしました
Brodie

1
これが本番環境に移行する場合は、実際には、遅延初期化された静的dateFormatterを作成することをお勧めします。dateFormatterの作成は、実際にはいくらかコストがかかります。
jessecurry 2010年

3
文字列ではなく日付オブジェクトとして必要ですが、この場合はどうすればよいですか?
Maystro 2013年

1
日付はタイムゾーンとは無関係に存在し、タイムゾーンは人間が消費する出力を生成するためにのみ使用されます。
jessecurry 2013年

@jessecurryまったく真実ではありません。NSDateクラス参照から:「このメソッドは、絶対参照日(2001年1月1日の最初の瞬間、GMT)を基準にした時間値を返します。」GMTへの明確で具体的な参照に注意してください。
マレーサガル

13

NSDateは、絶対参照日である2001年1月1日00:00GMTからの間隔への参照です。したがって、クラスメソッド[NSDate date]は、その間隔の表現を返します。そのデータをUTCでテキスト形式で表示するには、NSDateFormatterと適切なNSTimeZone(UTC)を使用して、必要に応じてレンダリングします。


3
この回答では、[NSDatenow]を[NSDatedate]にする必要があると思います。
foldinglettuce

2

NSDateオブジェクトは、特定のカレンダーシステムやタイムゾーンに関係なく、単一の時点をカプセル化します。日付オブジェクトは不変であり、絶対参照日(2001年1月1日の00:00:00 UTC)に対して不変の時間間隔を表します。

Swiftバージョン:

extension NSDate {
    func getUTCFormateDate() -> String {
        let dateFormatter = NSDateFormatter()
        let timeZone = NSTimeZone(name: "UTC")
        dateFormatter.timeZone = timeZone
        dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
        return dateFormatter.stringFromDate(self)
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.