NSDateFomatterのUnicode形式一覧


# NSDateFomatter
NSDateFomatterを使っていてはまっていたのでメモ。


``` objective-c
    NSDateFormatter *fomatter = [NSDateFormatter new];
    [fomatter setLocale:[NSLocale systemLocale]];
    [fomatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"JST"]];
    [fomatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]];
    [fomatter setCalendar:[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]];
    [fomatter setDateFormat:@"hh:mm"];
    
        self.notifiTimeStr  = [fomatter stringFromDate:date];
    
```
NSDateの情報を24時間表記で出力しようとしたら、どうも12時間表記しか出力されない

NSLocaleが指定が間違ってる？
NSTimeZoneがおかしい？
といろいろ確認したんですが、フォーマットの間違いでした。
hhと小文字で指定すると12時間表記。
HHと大文字で指定すると24時間表記なのだそう。

```objective-c
[fomatter setDateFormat:@"hh:mm"];//=>12時間表記
[fomatter setDateFormat:@"HH:mm"];//=>24時間表記
```

# フォーマットの形式一覧
setDateFormat のフォーマットはUnicode形式に従うそうです。
[Date Format Patterns](http://unicode.org/reports/tr35/tr35-6.html#Date_Format_Patterns)

ここを見ればどんな出力形式になるかがわかるそう。
せっかくなんでよく使いそうなものだけ日本語訳してみます。
間違いがあればコメント下さい。

| 項目  | 表示記号         | 繰り返し数 | 例| 説明|
|:-----------|:------------  |:------------ |:------------ |:------------ |
| 年 |y(小文字)          |1..n     |1996 |年。通常yの数で桁数表示。yの数で0パディング。ただしyyと二文字の場合は表示されるケタは下二桁になる|


例

| 年 | y | yy | yyy| yyyy | yyyyy|
|:-----------|:------------|:------------ |:------------ |:------------ |:--- |:---|
| 西暦1年       |        1 |     01  | 001 | 0001 | 00001|
| 西暦12年       |        12 |     12  | 012 | 0012 | 00012|
| 西暦123年       |        123 |     23  | 123 | 0123 | 00123|
| 西暦1234年       |        1234 |     34  | 1234 | 1234 | 01234|
| 西暦12345年       |        12345 |     45  | 12345 | 12345 | 12345|


| 項目　 | 表示記号　　　　 | 繰り返し数 | 例| 説明|
|:-----------|:------------|:------------ |:------------ |:------------ |
| 年       |        Y(大文字) |     1..n     | 1997 | ISO で定義された暦週に基づいた年(※1)。カレンダー表記と異なる場合がある|
| 月       |        M(大文字) |     1..2     | 09 | 月。表記記号が1つか2つの場合は数値を3つの場合は略語を、4つの場合は完全な表記を、5つの場合は限られた表記で表示。|
| 月       |        M(大文字) |     3     | Sept | 同上|
| 月       |        M(大文字) |     4     | September | 同上|
| 月       |        M(大文字) |     5     | S | 同上|
| 週       |        w(小文字) |     1..2     | 27 | 年内の暦週の番号(※1)|
| 週       |        W(大文字) |     1   | 3 | その月の週番号|
| 時間       |        h(小文字) |     1..2   | 11 | 時間表記は[1-12]|
| 時間       |        H(大文字) |     1..2   | 13 | 時間表記は[0-23]|
| 分       |        m(小文字) |     1..2   | 59 | 0パディング表記の1ケタか2ケタ|
| 秒       |        s(小文字) |     1..2   | 12 | 0パディング表記の1ケタか2ケタ|
| 秒       |        S(大文字) |     1..n | 3457 | 小数点表記。文字数で切り捨てる|

##　注釈
*1
ISO8601で定義されている年は、通常のカレンダーとは異なる年になる場合がある。
年内の暦週は「最初の木曜日を含む週が、その年の第1週である。」と規定されている。
そして、年初において以下の曜日に該当する場合、その日は新年の第1週の日としてではなく、旧年最終週の日として扱う。

* 1月1日金曜日・1月2日土曜日・1月3日日曜日--2010年が、これに該当する。
* 1月1日土曜日・1月2日日曜日--2011年がこれに該当。
* 1月1日日曜日--2012年がこれに該当。

逆に、年末において以下の曜日に該当する場合、その日は当年最終週の日としてではなく、翌年第1週の日として扱う。

* 12月29日が月曜日の場合。
* 12月30日が月曜日または火曜日の場合。
* 12月31日が月曜日・火曜日・水曜日のいずれかの場合。

## 参考
[ISO 8601 wiki](http://ja.wikipedia.org/wiki/ISO_8601#.E5.B9.B4.E3.81.A8.E6.9C.88.E3.81.A8.E6.97.A5)
[NSDateFormatterのYYYY利用時の注意点](http://mmasashi.hatenablog.com/entry/20101111/1289489570)
[欧米では週をWeek1、Week2などと通し番号で](http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1137117521)