macOS/iOS API解説

iOS , Mac アプリケーション開発のために使われる主要フレームワークの日本語情報です。2010年代に書かれた内容です。今後更新はありません。

目次

NSDateクラス

INDEX>Foundation>NSDate

apple(mac)
apple(iOS)

編集時のバージョン OS X 10.8,iOS 6.1

解説

継承 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秒 日本標準時

}

適合するプロトコル

サブクラス化の注意

引数

参照