Notionで締切までの日数を計算するときにdateBetweenが厄介だった話
やりたいこと
設定した日付"期限"と、今日の日付の差分をとって
・”期限”が未入力 → 締切未設定
・”期限”は明日以降 → 締切まであとXX日
・”期限”は今日 → 本日が締切です
・”期限”は昨日以前 → 締切をXX日過ぎています
と表示する
最終的なコード
ifs(empty(prop("期限")),"締切未設定",formatDate(now(),"YYYYMMDD")==formatDate(prop("期限"),"YYYYMMDD"),"本日が締切です",dateBetween(prop("期限"),now(),"days")+1>0,"締切まであと"+format(dateBetween(prop("期限"),now(),"days")+1)+"日","!!締切を"+format(abs(dateBetween(prop("期限"),now(),"days")))+"日超過!!")
これをプロパティ→数式を選んで貼り付ければ動くはず。締め切り日を”期限”と命名しているのに注意。
dateBetweenの罠
2つの日付を指定し、その差分をとるdateBetweenには隠された仕様が存在する。
dateBetween(prop("期限"),now(),"days") //期限の日付と、今日の日付の差分
上記のプロパティを適応した結果はこうなる
そう、明日が期限の予定が0で、更にややこしいのは今日と明日の数値が変わらず0になっている!
しかし昨日以前に関しては良い感じだ。absで絶対値をとればそのまま、”締め切り日をXX日超過しています”と表せる。
よってやるべきことは二つ。
・今日と明日を区別して、今日が締め切りの場合は例外処理
・明日以降の数値を+1して、直感に合わせる
if(formatDate(now(),"YYYYMMDD")==formatDate(prop("期限"),"YYYYMMDD"),"Today","NotToday")
今日かどうかの判定は、==を使ってやった。この時にformatDateを使用すると、日付の表示を統一してくれる。第二引数に文字列の形で指定するのだが、"YYYYMMDD"とすれば"20240825"みたいに変形してくれる。HHとかmmとかを入れれば時間・分まで分かるが、知りたいのは日付だけなのでこの8桁同士で計算すれば問題ないだろう。