カレンダーPlusの終日の仕様(終了日が1日後ろにずれる挙動)について
2020年2月2日
更新 2022年12月9日
kintoneプラグイン《カレンダーPlus》の終日の仕様(終了日が1日後ろにずれる挙動)について非常に多くのお問い合わせをいただいておりますため、こちらの記事で解説させていただきます。
カレンダーPlusでは、時刻が定まらない終日予定の登録が可能となっており、1日だけの終日予定もあれば、複数日に渡る終日予定の登録も可能となっています。開始日時・終了日時フィールドにはkintoneの日時フィールドまたは日付フィールドを設定することができますが、日付フィールドを設定いただいている場合は、時刻が無いため常に終日予定として登録されます。
開始日時・終了日時フィールドが日時フィールドの場合、2020/2/1の終日予定は以下のように登録されます。
- 開始日時:2020-02-01 0:00
- 終了日時:2020-02-02 0:00
- 終日チェックボックス:オン
開始日時・終了日時フィールドが日付フィールドの場合は以下のように登録されます。
- 開始日付:2020-02-01
- 終了日付:2020-02-02
- 終日チェックボックス:オン
また、2020/2/1~2020/2/3の3日間に渡る終日予定は以下のように登録されます。
【日時フィールドの場合】
- 開始日時:2020-02-01 0:00
- 終了日時:2020-02-04 0:00
- 終日チェックボックス:オン
【日付フィールドの場合】
- 開始日付:2020-02-01
- 終了日付:2020-02-04
- 終日チェックボックス:オン
以上の通り、日時フィールド・日付フィールドに関わらず、終了日時(終了日付)に格納される日付は翌日の日付となっています。詳細は後述しますが、これは RFC 5545 で規定されているスケジュールの標準フォーマット「iCalendar」の仕様に準じているためです。
終日予定に限ったものではありませんが、iCalendarの仕様では開始日時はその予定の期間に含むが、終了日時はその予定の期間に"含まれない"と定義されています。例えば、2020/2/1 9:00~2020/2/1 10:00 の予定は9時から10時までの1時間の予定になりますが、この仕様では
- 2020/2/1 9:00 ≦ 予定 < 2020/2/1 10:00
のような考え方となります。2020/2/1の終日予定で考えると
- 2020/2/1 0:00 ≦ 予定 < 2020/2/2 0:00
のようになるため、終日予定においては終了日時の日付が翌日になってしまうのです。しかし、2020/2/1の1日だけの終日予定の終了日が翌日の日付になってしまうというのは、コンピューターの理屈ではこの通りなのですが、人間の直感では少々イメージしづらいところかと思います。百歩譲って、日時フィールドであれば「2020/2/2 0:00の直前まで」と考えればまだ理解できなくもないと思いますが、これが時刻を持たない日付フィールドの場合は
- 2020/2/1 ≦ 予定 < 2020/2/2
のようになり、開始日が2020/2/1、終了日が2020/2/2としてkintoneにレコード登録されてしまうため、更に人間の直感からは程遠い状態になってしまいます。尚、日付のみのデータは、時刻としては暗黙的に 0:00 が想定されていますので、内部的には
- 2020/2/1 0:00 ≦ 予定 < 2020/2/2 0:00
のようになり、時刻フィールドの場合と同じ考え方になります。
ここまで理屈をこねてきましたが、カレンダーPlusにおける終日予定の終了日時の違和感は、「iCalendar」の仕様に準じているということと、かつkintoneなので、その内部的な日時・日付の持ち方がそのままフォームの値としてユーザーに見えてしまうことに起因しているものと考えます。
グループウェア等のカレンダーで終日予定を登録すると、2020/2/1~2020/2/3 の予定はまさにその通りに表示されているものがほとんどかと思います。しかし、「iCalendar」の仕様に準じているグループウェアであれば、内部的にはカレンダーPlusと同様に
- 開始日時:2020-02-01 0:00
- 終了日時:2020-02-04 0:00
というデータの持ち方をしているのではないかと思われます。あくまで表示上の工夫で人間に違和感が無いようにしているのではないでしょうか。
そこで、カレンダーPlusを使いつつ、kintoneの詳細画面ではどうしても直感的な方の終了日を表示させたいという場合は、計算フィールドで1日前の日付を表示させる方法をご案内しています。カレンダーPlusが利用する終了日のフィールド名を「終了日」とした場合、この計算フィールドの設定例は以下のようになります。
- フィールドタイプ:計算
- フィールド名(例):表示用終了日
- 計算式:終了日 - 86400
- 表示形式:日付
計算式で終了日から 86400 を引いていますが、日付や日時の計算はkintoneでは秒単位となっているためです。86400秒 = 1440分 = 24時間 = 1日 となります。
(2020/12/21追記)
上記回避策では、表示用終了日はあくまで計算フィールドであり、追加・編集画面からの入力ができなかったり、絞り込みの条件指定が難しいなどの課題があります。そこで、カレンダーPlus用の終了日と直感的な終了日の両方を日付フィールドとする回避策についてご案内いたします。
かりんこラボが提供している日付計算プラグインを利用すると、カレンダーPlusから登録した終日予定については、カレンダーPlusの終了日フィールド(日付フィールド)の日付の1日前の日付が直感的な終了日のフィールド(日付フィールド)に設定されます。一方、kintone標準の追加画面から入力した終日予定については、直感的な終了日フィールド(日付フィールド)の日付の1日後の日付がカレンダーPlusの終了日のフィールド(日付フィールド)に設定されます。ぜひお試しいただければと思います。
具体的な解説記事はこちらをご覧ください。
カレンダーPlusの終日仕様を日付計算プラグインで回避
(2022/12/9追記)
アールスリー社提供のgusuku Customineを利用した回避策についての記事が公開されています。こちらも併せてご確認いただければと思います。
カレンダーPlusの終日仕様をCustomineで何とかしようとした話し
カレンダーPlusの終日仕様をCustomineで何とかしようとした話し(後編)
以上、カレンダーPlusの終日予定の終了日の違和感について解説させていただきました。
スケジュールの標準フォーマット「iCalendar」の仕様に準じていることや、既にこの仕様でスケジュール登録して運用されているユーザー様が多くいらっしゃること、そして今後、他のカレンダーサービスとのスケジュールデータの連携などを考慮した場合、現行の仕様を変えて違和感の無い終了日を登録してしまうような改修は難しい状況ですので、背景をご理解いただきつつ、回避策としてご案内した計算フィールドの利用などをご検討いただければ幸いです。
今後も、皆さまにとって有用な機能を《カレンダーPlus》に取り込んでいきたいと思っておりますので、引き続き《カレンダーPlus》をご愛顧いただきますよう、どうぞよろしくお願いいたします。
ラジカルブリッジでは、チームワークを強化するオリジナルkintone業務アプリ構築サービス「ベストチーム365」を提供しています。89,890円の《わくわくプラン》と252,500円の《にこにこプラン》の2プランで、使いやすいオリジナルkintoneアプリを早く・安くご提供します。kintoneを活用した業務効率化やチームワークの強化に関心のある方は、ぜひ当社までお問い合わせください。