NSDateクラス
解説
継承 | NSObject |
準拠 | NSCopying |
NSSecureCoding | |
NSObject (NSObject) | |
フレームワーク | /System/Library/Frameworks/Foundation.framework |
使用可能 | Mac OS X v10.0以降 |
iOS 2.0以降 | |
定義 | NSDate.h |
OS X 10.8でNSCodingがNSSecureCodingに変更になりました。
iOS 6.0でNSCodingがNSSecureCodingに変更になりました。
概要
本クラスについて
日付と時刻を表すクラスです。日と時刻、タイムゾーンの情報を持っています。NSDateでの計算は秒の加減算しかありません。日時の加減算はNSCalendarクラスとNSDateComponentsクラスを使って行います。
作成と初期化
現在の日時のNSDateオブジェクトを取得するには(+ date)メソッドを使用します。現在から一定の時間(秒)遅れたNSDateオブジェクトを取得するには(+ dateWithTimeIntervalSinceNow)メソッドを使用します。
言語環境、カレンダーが「和暦」になっていると「年」が0024(平成24年の場合)で返ってくるので注意が必要です。
#pragma mark NSDate date -(void)method001 { NSDate *aDate = [NSDate date]; NSLog(@"%s %@",__FUNCTION__,[aDate description]); //=>-[OOOAppDelegate method001] 2012-08-15 14:12:26 +0000 }
指定した日時から一定の時間(秒)遅れたNSDateオブジェクトを取得するには(+ dateWithTimeInterval:sinceDate:)メソッドを使用します。
2001-01-01 00:00:00 +0000から一定の時間(秒)遅れたNSDateオブジェクトを取得するには(+ dateWithTimeIntervalSinceReferenceDate)メソッドを使用します。
1970-01-01 00:00:00 +0000から一定の時間(秒)遅れたNSDateオブジェクトを取得するには(+ dateWithTimeIntervalSince1970)メソッドを使用します。1970年1月1日というのはUNIX時間の起源です。
上記のクラスメソッドと同様にallocで作成したあと初期化するためのメソッドがあります。(– init)(– initWithTimeIntervalSinceNow)(– initWithTimeInterval:sinceDate)(– initWithTimeIntervalSinceReferenceDate)(– initWithTimeIntervalSince1970:)
かなり遠い将来の日付というのが(+ distantFuture)メソッドで取得できます。4001-01-01 00:00:00 +0000に設定されています。かなり遠い過去の日付というのも(+ distantPast)メソッドで取得できます。0001-12-30 00:00:00 +0000に設定されています。なぜ12月30日なのかはわかりません。
日時の計算
二つの日時が同じかどうかを調べるには(– isEqualToDate)メソッドを使用します。
二つの日時を比較して早いほうの日時を取得するには(– earlierDate)メソッドを使用します。二つの日時を比較して遅いほうの日時を取得するには(– laterDate)メソッドを使用します。
レシーバと別の日時を比較して結果を返すには(– compare)メソッドを使用します。レシーバのほうが別の日時より早い場合はNSOrderedAscendingが返されます。
遅い方の時刻を得るサンプル
#pragma mark NSDate earlierDate: laterDate: -(void)method009 { NSDateFormatter * formatter = [[NSDateFormatter alloc] init]; [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss Z"]; NSDate *aDate = [formatter dateFromString:@"2012-08-15 00:00:00 +0900"]; NSDate *bDate = [formatter dateFromString:@"2012-08-16 00:00:00 +0900"]; NSDate *cDate = [aDate earlierDate:bDate]; NSLog(@"%s %@",__FUNCTION__,[cDate description]); //=>-[OOOAppDelegate method009] 2012-08-14 15:00:00 +0000 NSDate *dDate = [aDate laterDate:bDate]; NSLog(@"%s %@",__FUNCTION__,[dDate description]); //=>-[OOOAppDelegate method009] 2012-08-15 15:00:00 +0000 }
インターバルを得る
レシーバと別の日時とのインターバルを取得したい場合は(– timeIntervalSinceDate)メソッドを使用します。レシーバと現在の日時とのインターバルを取得したい場合は(– timeIntervalSinceNow)を使用します。
レシーバと2001-01-01 00:00:00 +0000とのインターバルを得るには(– timeIntervalSinceReferenceDate)メソッドを使用します。現在の時刻と2001-01-01 00:00:00 +0000とのインターバルを得るには(+ timeIntervalSinceReferenceDate)メソッドを使用します。
レシーバと1970-01-01 00:00:00 +0000とのインターバルを得るには(– timeIntervalSince1970)メソッドを使用します。
#pragma mark NSDate timeIntervalSinceDate: -(void)method016 { NSDateFormatter * formatter = [[NSDateFormatter alloc] init]; [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss Z"]; NSDate *aDate = [formatter dateFromString:@"2012-08-15 00:00:00 +0900"]; NSTimeInterval interval = [aDate timeIntervalSince1970]; NSLog(@"%s %f",__FUNCTION__,interval); }
インターバルの加算
レシーバの日時にインターバルを加えた新しいNSDateを作成するには(– dateByAddingTimeInterval:)メソッドを使用します。
文字での表現
レシーバの日時を文字列として表すためには(– description)メソッドを使用します。ローカライズされた文字列として表すためには(– descriptionWithLocale)メソッドを使用します。指定した地域の標準時も考慮されて、文字列が返されます。
インターバルを加算してローカライズされた文字列にするサンプル
#pragma mark NSDate descriptionWithLocale: -(void)method011 { NSDateFormatter * formatter = [[NSDateFormatter alloc] init]; [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss Z"]; NSDate *aDate = [formatter dateFromString:@"2012-08-15 00:00:00 +0900"]; NSDate *cDate = [aDate dateByAddingTimeInterval:(NSTimeInterval)60]; NSLog(@"%s %@",__FUNCTION__,[cDate description]); //=>2012-08-14 15:01:00 +0000 NSLocale *jpLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"ja-JP"]; NSLog(@"%s %@",__FUNCTION__,[cDate descriptionWithLocale:jpLocale]); //=>2012年8月15日水曜日 0時01分00秒 日本標準時 }
適合するプロトコル
メソッド
日付オブジェクトの作成と初期化
+ date
+ dateWithTimeIntervalSinceNow:
+ dateWithTimeInterval:sinceDate:
+ dateWithTimeIntervalSinceReferenceDate:
+ dateWithTimeIntervalSince1970:
– init
– initWithTimeIntervalSinceNow:
– initWithTimeInterval:sinceDate:
– initWithTimeIntervalSinceReferenceDate:
– initWithTimeIntervalSince1970:
仮想の最大値、最小値を得る
時間間隔を得る
– timeIntervalSinceDate:
– timeIntervalSinceNow
+ timeIntervalSinceReferenceDate
– timeIntervalSinceReferenceDate
– timeIntervalSince1970
間隔を追加
– dateByAddingTimeInterval:
– addTimeInterval OS X 10.6,iOS 4.0で非推奨