Swiftでdate format後のyear部分が想定と違う数字になってしまう
こんにちは!
先日swift3でで日付をフォーマットした際にyyyy
の部分が想定と違う数字になったのでそのメモです。
Date()
で取得できるデータは現在の日付ですが、
2018-12-15 05:09:30 +0000
これをDateFormatter
でyyyy-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
見慣れない笑