見出し画像

【Adalo/Click】時間の足し算、引き算は内部でどんな計算をしているのか?

(なぜこれを書いたか)
アプリを作るときに日付関数を使う事はよくあると思います。今回は日付関数を使って時間の足し算、引き算のやり方、またそれの意味するところを説明します。

時間はすごく重要な概念なのにもかかわらず、使い方に関してAdaloのマニュアルでもネットでも説明しているサイトがあまりないので自分で書いてみることにしました。

1.日付関数はこういう意味だった

このブログを書いているのは2023年1月8日(日)です。AdaloでもClickでもほぼ同様の日付関数が入っており、現在時刻ならばCurrent Time、単なる日付だけだったらStart of Today等を使うと表示することが出来ます。

いきなり結論から書いてしまいますが、AdaloやClickで使われている日付関数は1970年1月1日0:00からの経過日数を表示しています。
プログラムの世界にUNIX Timeというのがありますが、これは1970年1月1日0:00からの経過秒数で日付を表示するという考えですが、AdaloとClickの日付関数は秒ではなく「日単位」にした考え方なのです。

他のNoCodeアプリがAdaloとClickのやり方と同様なのかは知りません。Googleスプレッドシートで使われている日付関数は1970年ではなく、1900年1月1日0:00からの経過日数で日付を表示していますのでアプリやソフトウエア―毎に日付に関する考え方は違うようです。

①本日の日付のデータはこうなっています
今日の日付:2023年1月8日(日)→人間が認識できるデータ表現
Adalo/Clickがアプリ内部で持っているデータ・・・19365

19365というのは、2023年1月8日は1970年1月1日0:00を起点とすると、19365日経過したという意味です。

②手計算で日付データを調べてみる
せっかくだから最初は手計算からやってみましょうか。
・経過年数(1970年1月1日~2023年1月8日)・・・52年経過
・うるう年は何回あったか?・・・52年/4年=13回

上記を基に1970/1/1から2023/1/8までの経過日数を計算してみます。
365日/年×52年+13日(うるう年)+7日(今日は1月8日なので)
=19,345+13+7→19365日

まあ、普通はこんなことやらないんですが、Adalo/Clickでは19365というのは2023年1月8日の日付を表示するためのデータだという事を頭に入れて下さい。

③Adaloで日付データを調べてみる
日付の入った以下のような「勤怠管理」というデータベースを作りました。
「日にち」というプロパティは本日の日付(2023/1/8)を入れてあります。

これをカスタムリストで表示してみます。開発画面とプレビュー画面を並べてみます。左端の「日にち」を2通りのやり方で表示してみました。
右側のプレビュー画面では「日にち」部分が2段になって2023-01-08と19365の2通りが表示されているのが分かるでしょうか?

19365というデータは以下のようにすれば表示されます。テキストコンポーネントをCustom Formulaと関連付け、さらに勤怠管理データベースの「日にち」を引っ張ってくると日付表示ではなく数値で持っている内部データが現れます。

要はアプリ内部では「日付」の表示は人間に分かる表現(例:2023/1/8)と、経過日数の数字(例:19365日)の2通りのデータがあるという事です。何か計算するときは経過日数の数字(日単位)を使えばいいのです。

2.現在時刻を数字で表してみる

日付の表示ルールがだんだん分かってきたところで、現在時刻を1970年1月1日0:00からの経過日数で表示する練習をしてみましょう。
(例)
現在時刻:2023年1月8日10:43
これを数値(経過日数)で表示してみます。
2023年1月8日0:00・・・19365日でしたね。
残るは10:43(午前10時43分)を日単位で表現すればいいのです。
時間と分が混在しているのでまずは、すべて時間(H)で表します。
43分・・・43/60分=0.71666H
10:43 → 10H+0.71666H = 10.71666H

1日は24Hなので24で割ります。
10.71666H÷24H/日=0.44652日
これで10:43が日単位で表現できました。従って2023/1/8 10:43は以下のような経過日数の数値で表現できます。
19365日+0.44652日→19365.44652日

理屈が分かればそんなに難しくないですね。

3.勤怠管理に応用する

それでは時間の足し算、引き算をどのようにアプリに応用していくか見ていきましょう。1.で表示したカスタムリストをもう一度見て下さい。

カスタムリストの右端に「勤務時間」という項目がありますね。これを以下のようにして求めてみます。
勤務時間=勤務終了時間ー勤務開始時間ー1H(※)
※お昼の12:00~13:00の1Hは休み時間という事で勤務時間から除きます。

(計算方法)
~田中さんの場合~
勤務開始 08:45(内部データ:19365.3645日)
勤務終了 17:00(内部データ:19365.7083日)
引き算すると17:00 - 08:45 - 1→7H15分勤務→7.25H

Adaloで計算するには以下のようにします
①時間(H)の部分の計算
INT((勤務終了時間ー勤務開始時間)×24)

「勤務終了時間ー勤務開始時間」で日単位の勤務時間が算出されます。これに24Hをかけて時間(H)単位に変換します。通常、端数が出るのでINTで切り捨てをします。

②「分」の計算
計算式は下記画像のようになります。「勤務終了ー勤務開始」が何度も出てくるので複雑に見えますが、本当は単純です。
日数差=勤務終了ー勤務開始 と置き換えれば以下の式になります。
ROUND(((日数差×24-INT((日数差×24))×60)

(注)ROUNDで四捨五入しているのは45分と出したいときに計算上44.9999・・・と循環小数になるときがあります。これをINTで切り捨てて44分にするより四捨五入して45分にした方が実態に即しているのでROUNDを使っています。

Custom Formulaを使って上記の設定をすると以下のように「勤務時間」が求められます。(カスタムリストの右端)

4.時間の足し算の応用

今迄は時間の引き算をやってきましたが、足し算でも応用が出来ます。
以前私は「時間を入力しないカレンダーの使い方」というブログを書いたことが有ります。(下記リンク参照)

~週末ボランティア活動に応用~
これはこういう時に使いました。日曜日にやるボランティア活動があり、活動時間は毎週9:00~12:00と決まっていました。Adaloのカレンダーを使う場合は必ずデータベースに「開始時間」と「終了時間」を入れるお約束があります。時間は決まっているんだから日付だけ指定して、時間の入力は不要になる方法は何かないかと考えた時に「時間の足し算」を思いつきました。

(やった事)
入力フォームで「名前」と「参加日」(Date Picker使用)だけを入力します。開始時間と終了時間は時間の足し算をして自動入力にしたのです。

9:00と12:00は日単位に変換するとそれぞれ0.375日、0.5日になります。
DatePickerで日にちを指定すれば1970年1月1日0:00からの経過日数がアプリ内部で自動で計算されます。それに+0.375と+0.5を加算した数字をデータベースに入れてやればいいのです。(詳しくは上で紹介したブログを見て下さい)

時間関数の理屈さえ理解していればいろいろ応用が出来そうです。

(過去の投稿)


この記事が気に入ったらサポートをしてみませんか?