アラのアラアラしい日記

こっそりかいてます

Swiftでdate format後のyear部分が想定と違う数字になってしまう

こんにちは! 先日swift3でで日付をフォーマットした際にyyyyの部分が想定と違う数字になったのでそのメモです。

Date()で取得できるデータは現在の日付ですが、

2018-12-15 05:09:30 +0000

これをDateFormatteryyyy-MM-ddの形式にフォーマットした場合、

2018-12-15

こうなる想定だったはずが、実際にフォーマットされた数字が、

0030-12-15

でした。

この0030は、平成30年の意味で、DateFormatterのカレンダーを設定していない場合、デバイスに設定されているカレンダーの種類を使用してフォーマットされています。 私の使用していたデバイスの設定が日本カレンダーになっていた為、フォーマット後の年が0030になっていまっていました。

これはUserDefaultsなどでデバイスに保存された日付とサーバーから取得した日付を比較する場合に2018年と30年を比較することになり、データに誤作動が出ていまします。

バイス設定でSettings > General > Language&Region > Calendarからカレンダーの種類を変更することが可能ですが、フォーマットする際にコード上でカレンダーを設定しておくことが最適な方法だと思います。

let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd"
formatter.calendar = Calendar(identifier: Calendar.Identifier.gregorian)
formatter.string(from: Date())

これでデバイス設定関係なく2018を取得することが出来ます。

バイスの設定から変更できるのはGregorian, Japanese, Buddhistの3種類ですが、コードではもっと多くの種類に変更が可能です。

Calendar.Identifier - Calendar | Apple Developer Documentation

ちなみにBuddhistを選択した場合は以下のようになります。

2561-12-15

見慣れない笑