ぴゅこらーと:「出会って何日目」の日数計算の仕様
最近、ちょっとしたきっかけで、2.5次元Vチューバーの「ぴゅこる」さん (国王) が、配信サイトの「ツイキャス」で、毎日深夜2時から定期配信をしている「ぴゅこる王国放送」向けのスマホアプリ:
ぴゅこらーとには、
- ぴゅこる王国配信で開催されている「ぴゅこるスタンプラリー」というイベント向けのメモ帳機能や、
- ぴゅこる王国配信の開始時/終了時のプッシュ通知機能、
- メトロノーム機能などの
いくつかの機能があります。
以前、アプリを使っている方から、これらの機能に加えて、「推しアプリ」などにある様な、推しに出会ってからの経過日数を表示する機能を追加して欲しいという要望があったので、「出会って何日目」という、アプリ内で指定した記念日からの経過日数を表示する機能を、末にリリースされた「ぴゅこらーと」バージョン0.1.3に追加しました。
設定されたの日付(=記念日)から現在までの日数を表示する機能なので、単に経過した日数だけを表示するだけなら比較的単純なのですが、これに、「何年何か月何日目」という表示方法のオプションを加えてみた処、記念日の日付が特定の日付の場合は経過日数の計算方法が少しややっこしかったので、ここに「ぴゅこらーと」で採用している経過日数の計算方法をメモしておきます。
前置き
カレンダー上の日数
人間が手で計算する場合は、記念日と本日のをカレンダー上で確認してから間の日数を手動で数える事になりますが、iPhoneやAndroidなどの電算機器内部では、少し違った計算方法が使われます。
というのも、iPhoneやAndroidなどのアプリなどを作るプログラミングでは日時は「年月日」ではなく、1970年1月1日(午前)0時0分0秒 (UTC)からの秒数として処理されるのが一般的です。
「1692701522299秒」として処理されます。
実際に画面に表示する際などには、秒数から、人間に分かり易い「年月日」に変換する必要があって、アプリを作るのに使うプログラミング言語には、秒数からカレンダーの日時、その逆のカレンダーの日時から秒数へ変換する関数が用意されているのが一般的です。
でも、プログラミング言語によって、用意されている関数の結果が微妙に違う場合もあったり、同じ言語でも特に古いバージョンのOS用だとうるう秒が適用方法が違うなど、計算方法に細かい違いがある場合もあったりするので、違う言語を混ぜて使う場合は注意が必要になります。
プログラミング言語の違い
最近スマホアプリの開発には「Flutter/Dart」という、AndroidやiOSのアプリを同時にプログラム出来る言語を使っているので、出来上がったAndroidアプリとiOSアプリ間での違いはあまり気にしていませんでしたが、ホーム画面にアプリから情報を表示出来るウイジェットを「ぴゅこらーと」に追加した処、ウイジェットに関しては「Flutter/Dart」が対応していなくて、AndroidとiOSで各OSに対応した独自の言語を使う必要がありました。
また、「ぴゅこらーと」では「出会って何日目」の表示をアプリ本体のメイン画面とウイジェットで表示する仕様の為、違う言語を使っても同じ結果が表示される必要があります。
「ぴゅこらーと」のウイジェットのAndroid版は「Kotlin」、iOS版は「SwiftUI」という言語を各々使いましたが、Android版のウイジェットはFlutterアプリで算出した「年月日」を表示する事が出来るので、特に問題がありませんでした。
iOS版の場合はアプリとは別にウイジェットが独自にSwiftUI言語を使って経過日数を計出する必要がありました。
何日目
単純に「出会って100日目」や「出会って1000日目」といった「何日目」という経過日数を計算する場合は次の様に:
といった数式になります。
これは、「Flutter/Dart」、「Kotlin」、「SwiftUI」のどの言語でも、日数を計算してくれる関数があるので簡単に処理できるうえ、違う言語間での計算結果が違うという事もありません。
これだけだとプログラミンは比較的簡単です。
因みに、記念日の当日(表示日が同じ日付の場合)は「何日目」は「1日目」と表示されます。
何年、何か月
冒頭にも書きましたが、これに加えて:
- 何か月何日目
- 何年何か月何日目
という表示になると、記念日と表示日の日付の組み合わせによっては、経過日数の計算が少しややっこしくなる場合があります。
1.簡単な場合
簡単な場合の例としては、記念日がの場合:
記念日当日の | は | 「1日目」 |
記念日翌日の | は | 「2日目」・・・ |
記念日の次の月の同じ日の | は | 「1か月と1日目」 |
よってその前日の | は | 「1か月目」 |
月だけが違う | だと | 「10か月と1日目」 |
記念日の次の年の同じ月と日の | だと | 「1年と1日目」 |
の様に、記念日の月と日が、各々で表示日の月と日よりも小さい場合は:
{(表示日の月) - (記念日の月)}か月
{(表示日の日) - (記念日の日)+1}日目
という計算になります。
※ 記念日と表示日の日の値が同じの場合は「・・・ 1日目」となります。
2-1.記念日の値が大きい場合
でもこれが、記念日の日が表示日の日よりも大きい場合は、表示日の方の月から前月の文の日数を繰り下げ、記念日の月が表示日の月よりも大きい場合は表示日の方の年から12か月分を繰り下げする必要があります。
なので、記念日がの場合:
だと | は28日間あるので | |
28日間 + (10日 - 16日 + 1)で | 「23日目」 | |
だと | 12か月 + (1月 - 1月)で | 「12か月と1日目」 又は「1年と1日目」 |
となります。
2-2.記念日の値が大きい場合 + 記念日の日が29以上の場合
これに加えて、記念日の日が29∼31の値の場合は、表示日の月によっては記念日と表示日同じ日が無いので次の月の初日 (1日)の表示が問題になります。。
例えば、記念日がの場合:
だと | 記念日と表示日共に31日なので | 「2か月と1日目」 |
だと | 👆の+1日なので | 「2か月と2日目」(6月の初日) |
: : : | ||
だと | 👆のの+28日なので | 「2か月と30日目」になって、 |
だと (月の最終日) |
👆のの+29日なので | 「2か月と31日目」となるはず※です。 (※: 実際は違います。) |
これまでは記念日と表示日の日の値が同じ場合は「・・・ 1日目」となっていましたが、は30日までで、31日が無いので、月明け初日のの表示はどうすべき??となります。
「出会って何日目」での仕様
「ぴゅこらーと」の「出会って何日目」では、記念日の日が、表示日の前月の最終日の値よりも小さい場合は月初めが「・・・1日目」となる様にしています。
また、この場合、前月の最終日になる日の表示は0日目という扱いで、「・・・」に当たる表示になります。
例として、記念日がの場合:
だと | 前月が30日までなので | 「3か月と1日目」 |
👆の前日の月末なので | 「3か月 目」となります。 |
まとめると:
- 記念日と表示日が同じ場合は「1日目」、
- 記念日と表示日の日が同じ場合は「・・・1日目」、
- 記念日の日が、表示日の前月の最終日の値よりも小さい場合は月初めが「・・・1日目」となり、その前日の月末が0日目として「・・・目」となります。
※: 「・・・」の部分は、カレンダーの年月日表記から計算された「XX年 YYか月」または「ZZか月」といった表示になります。
コメント
コメントを投稿