使わない人は存在にすら気づいていないかもしれない「和暦」
iOSでは
設定アプリ > 一般 > 言語と地域 > 暦法
から変更できます。
タイ仏暦ってなんぞ?
暦法を変えることで、対応しているアプリでは表記が平成になります。
ふぅ〜〜んと聞き流すような内容ですが、ローカルプッシュ通知を使う場合、この和暦が大きく影響して来るので気をつけて下さい!
和暦がローカルプッシュに影響する?
ローカルプッシュ通知は、サーバーを使わず、アプリだけでプッシュ通知ができる機能でiOS10以降ではUIUserNotificationがdeprecatedになり、UNUserNotificationCenterに変わりました。
プッシュ通知をする日時はDateComponentsクラスのパラメータ、year, month, day, hour, minuteに指定して渡す、とてもシンプルな仕組みです。
が!
ここに罠がありました。
DateComponentsのパラメータ「year」が
iPhoneの暦法が西暦の場合は西暦を、和暦の場合は和暦をセットしないといけないんです。
つまりiPhoneは和暦設定なのに、yearに2019なんて指定しちゃうと、平成2019年( 西暦4050年!! )になるまでローカルプッシュが発動しません。
対処法
日付を処理する場合は暦法が影響しないDate型で処理します。
そしてDateComponentsに変換する場合は
let dateComponent = Calendar.current.dateComponents([.year, .month, .day, .hour, .minute, .weekday], from: timerDate)
とすると、「Calendar.current」の所で、自動的に、yearの中にiPhoneで設定した暦法の値(西暦? or 和暦? or タイ仏暦(なにこれ?))が入るようにいい感じに処理してくれます。
逆にiPhoneの設定にかかわらず西暦が欲しい(和暦が欲しい)という場合は
// 西暦
let dateComponent = Calendar(identifier: .gregorian).dateComponents([.year, .month, .day, .hour, .minute, .weekday], from: timerDate)
// 和暦
let dateComponent = Calendar(identifier: .japanese).dateComponents([.year, .month, .day, .hour, .minute, .weekday], from: timerDate)
とCalendarのコンストラクタの引数に明示的に暦法の種類を指定すればOKです。
twitterでも個人開発情報をつぶやいていますので、フォローをお願いします。
Brgfx – jp.freepik.com によって作成された background ベクトル