Date型の比較@ObjC/Swift

Date型の比較をするとき、多くの場合は"2016-12-09"とか"2016-12-09 10:00:00+0900"とか、年月日か年月日と時分秒までの比較が多いのかなと思いますが。

Objective-C

-[NSDate earlierDate:]-[NSDate laterDate:]が使えるので、挙動を理解していればそれがラクかなと思いますが、可読性を考えると[NSDate compare:]で比較した方がわかりやすいときもあるかもしれない。

-[NSDate earlierDate:]-[NSDate laterDate:]は自身とanotherDateの値が等しい場合には自身の値を返すことだけ覚えておく必要がある。(なのでログ出力ではポインタを吐いている

NSDateFormatter *df = [[NSDateFormatter alloc] init];
df.locale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"];
df.dateFormat = @"yyyy-MM-dd";
NSDate *d1 = [df dateFromString:@"2016-12-09"];
NSDate *d2 = [df dateFromString:@"2016-12-09"];
NSDate *d3 = [d1 earlierDate:d2];
NSDate *d4 = [d1 laterDate:d2];
NSComparisonResult compare = [d1 compare:d2];
df.dateFormat = @"yyyy-MM-dd HH:mm:ss.SSSS:Z";
NSLog(@"d1: %p: %@", d1, [df stringFromDate:d1]);
NSLog(@"d2: %p: %@", d2, [df stringFromDate:d2]);
NSLog(@"d3: %p: %@", d3, [df stringFromDate:d3]);
NSLog(@"d4: %p: %@", d4, [df stringFromDate:d4]);
NSLog(@"compare: %@", (compare == NSOrderedSame) ? @"same" : (compare == NSOrderedAscending) ? @"ascending" : @"descending");

// output
d1: 0x7c9007d0: 2016-12-09 00:00:00.0000:+0900
d2: 0x7c9007e0: 2016-12-09 00:00:00.0000:+0900
d3: 0x7c9007d0: 2016-12-09 00:00:00.0000:+0900
d4: 0x7c9007d0: 2016-12-09 00:00:00.0000:+0900
compare: same

Swift

Date.compareを使うだけなのであまり考える必要がない。

なおSwift3のDate型はString(format:)でポインタを出力することができないのでUnsafePointerなどを使う必要があるもよう。

let df:DateFormatter = DateFormatter()
df.locale = Locale(identifier: "en_US_POSIX")
df.dateFormat = "yyyy-MM-dd"
let d1:Date = df.date(from: "2016-12-09")!
let d2:Date = df.date(from: "2016-12-09")!
let compare:ComparisonResult  = d1.compare(d2)

switch compare {
case .orderedSame :
    print("d1 == d2")
    break
case .orderedAscending :
    print("d1 < d2")
    break
case .orderedDescending :
    print("d1 > d2")
    break
}

// output
d1 == d2