NSDateのTips

たまに忘れるのでメモ、あんまり増えないかも

## 現在時刻の取得
```objective-c:
NSDate *date = [NSDate date];
// 2014-02-17 14:17:01 +0000
```
注意
ここでいう現在時刻というのは、iOSの`設定 > 一般 > 日付と時刻`で指定されたものになります


## dateFormat
カスタムフォーマットを指定したい場合は`NSDate.dataFormat`または`setDateFormat:`を使う

```objective-c:
NSDate *date = [NSDate date];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];

/* 12時間表記 */
dateFormatter.dateFormat = @"yyyy/MM/dd hh:mm:ss";
NSString *date12 = [dateFormatter stringFromDate:date];
// 2014/02/18 11:08:12

/* 24時間表記 */
dateFormatter.dateFormat = @"yyyy/MM/dd HH:mm:ss";
NSString *date24 = [dateFormatter stringFromDate:date];
// 2014/02/18 23:08:12

/* 0埋め表記 */
dateFormatter.dateFormat = @"yyyy/M/d h:m:s";
NSString *date0 = [dateFormatter stringFromDate:date];
// 2014/2/18 11:8:12
```
表記したいフォーマットパターンは[Data Formatting Guide](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/DataFormatting/Articles/dfDateFormatting10_4.html#//apple_ref/doc/uid/TP40002369-SW1)に記されています
一部抜粋
>OS X v10.9 and iOS 7 use version [tr35-31](http://www.unicode.org/reports/tr35/tr35-31/tr35-dates.html#Date_Format_Patterns).
>OS X v10.8 and iOS 6 use version [tr35-25](http://www.unicode.org/reports/tr35/tr35-25.html#Date_Format_Patterns).


## 日本語環境でのdateFormat
日本語の"日付と時刻"の設定で"24時間表示"というのがある
この設定がON/OFFの違いで24時間表示にした際の取得できる時刻が異なるので、注意が必要

```objective-c:
NSDate *date = [NSDate date];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
// 12時間表示
dateFormatter.dateFormat = @"yyyy/MM/dd hh:mm:ss";
NSString *date12 = [dateFormatter stringFromDate:date];
// 24時間表示
dateFormatter.dateFormat = @"yyyy/MM/dd HH:mm:ss";
NSString *date24 = [dateFormatter stringFromDate:date];
```
```objective-c:24時間表示OFF
NSLog(@"%@", date12);
// 2014/02/18 11:08:12
NSLog(@"%@", date24);
// 2014/02/18 23:08:12
```
```objective-c:24時間表示ON
NSLog(@"%@", date12);
// 2014/02/18 11:08:12
NSLog(@"%@", date24);
// 2014/02/18 午後11:08:12
```
「午後」とか「午前」とか表示されてしまう
これは`NSDateFormatter`の`locale.localeIdentifier`が`ja_JP`であるのが原因である

### NSDateで「午前／午後」表示させない
```objective-c:
NSDate *date = [NSDate date];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"yyyy/MM/dd HH:mm:ss";
NSString *defaultLocale = [dateFormatter stringFromDate:date];
// dateFormatter.locale.localeIdentifier:ja_JP defaultLocale:2014/02/17 午後11:35:44

dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
NSString *usLocale = [dateFormatter stringFromDate:date];
// dateFormatter.locale.localeIdentifier:en_US_POSIX usLocale:2014/02/17 23:35:44
```
データフォーマットの`locale`を`en_US_POSIX`identifierで上書きしてあげるだけでOK
こういう処理はいちいち入れるのではなく、`NSDate`クラスをカテゴライズした方が使いやすいかも


## 文字列(NSString)からNSDateに変換する
```objective-c:
NSString *dateString = @"2014/02/17 23:15:46";
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"yyyy/MM/dd HH:mm:ss";
NSDate *date = [dateFormatter dateFromString:dateString];
// 2014-02-17 14:15:46 +0000
```
注意
`NSDate.dataFormat`または`setDateFormat:`を指定しないで文字列変換すると`@""`が返ってくる


## 日時を比較する
```objective-c:
NSDate *date1 = [NSDate date];
NSDate *date2 = [NSDate date];
NSComparisonResult result = [date1 compare:date2];
switch(result) {
    case NSOrderedSame:
        // 同じ日時
        break;
    case NSOrderedAscending:
        // date1 < date2
        break;
    case NSOrderedDescending:
        // date1 > date2
        break;
}
```


## 日時を時間や分で比較する
```objective-c:
NSString *before = @"2014/02/17 22:15:46";
NSString *after  = @"2014/02/17 23:17:49";
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"yyyy/MM/dd HH:mm:ss";
NSDate *beforeDate = [dateFormatter dateFromString:before];
NSDate *afterDate  = [dateFormatter dateFromString:after];

NSTimeInterval sec = [afterDate timeIntervalSinceDate:beforeDate];
// sec:3723
int hour = (int)(sec / 3600);
// hour:1
int min  = (int)((sec - hour) / 60);
// min:62
```
`timeIntervalSinceDate:`を使うことで、日時の比較をおこなう