カテゴリー内の他の記事

UltraDate.js,UltraDate.ja.js を使って営業日/休業日を判定する

(著者:サイボウズ kintone 開発チーム 太田 絵一郎)

概要

  • タイムカード等の業務アプリでは、会社の休業日を判定したいケースがしばしばあるかと思います。
  • 会社の休業日を判定するには普通、曜日だけでなく、国民の休日を取り扱う必要があります。しかし、国民の休日を取り扱うプログラムを自作するのは、必ずしも簡単ではありません。
  • UltraDate.js は、JavaScript標準のDateオブジェクトを拡張するライブラリです。さらに、付属のUltraDate.ja.jsを併せて使うことで、日本の国民の休日も取り扱えるようになります。
  • 本ページでは、kintoneに入力した日付が休業日かどうかを Cybozu CDN にストックされた UltraDate.js / UltraDate.ja.js を使って判定する、簡単なサンプルをご紹介します。

できること

  • 入力した日付が休業日かどうかを判定し、その結果を別の文字列(1行)フィールドに表示する。
  • 土曜日・日曜日・国民の休日に加えて、会社独自の休日(ここでは年末年始休暇)も休日と判定できるようにする。

準備

1. アプリを作成し、下の図のようにフィールドを配置します。なお、本サンプルで必須なフィールドは次の2つのみです:

  • 日付: 日付フィールド [フィールドコード:date]
  • 営業日/休業日: 文字列(1行)フィールド [フィールドコード:dayInfo]

2. 以下のカスタマイズJSファイルを作成し、ファイル名 checkHoliday.js で保存します。

3. 作成したアプリの「アプリの設定」>「詳細設定」>「JavaScript / CSSでカスタマイズ」から、下図を参考にスクリプトを設定します(順番も重要ですのでご注意下さい。)

結果

作成したアプリでレコードを作成し、日付を

  • 2016年2月11日(建国記念の日 → 休業日)
  • 2016年2月12日(金曜日 → 営業日)
  • 2016年2月13日(土曜日 → 休業日)

と入力すると、「営業日/休業日」フィールドの表示が図のように変わります。

また、例えば2016年12月29日を入力すると、スクリプトで追加した年末年始休暇である旨が表示されます(実際に試してみてください)。

終わりに

単純なサンプルですが、業務上は応用範囲の広い機能だと思います。なお例えば、土曜日が通常営業日であるような場合にも、少しの修正で対応することができます。詳細はUltraDate.js の公式ページをご参照ください。

本ページが少しでもお役に立てば幸いです。

このTipsは、2016年2月版で確認したものになります。

記事に関するフィードバック

記事のコメント欄は記事に対するフィードバックをする場となっております。
右の記事フィードバックのためのガイドを参照してコメントしてください。
記事のリンク切れなど、気になる点がある場合も、こちらのフォームからフィードバックいただけますと幸いです。

Avatar
dd

モバイル版とPC版どちらも利用したいのですが、

モバイル版で試したところ昨日しませんでした。

ご教授いただければ幸いです。

Avatar
柳生

いつも大変お世話になっております。

恐れ入りますが、UltraDate.js を勤怠管理アプリで使って、祝日の判定を行っておりますが、

7/20(月)が祝日と判断され、7/23(木)が祝日となれないですが、

海の日(祝日)は第三月曜日今年はオリンピックの予定だったので7/23に変更されたからでしょうか?

なにか更新されることなどありましたら、ぜひ教えて頂けると幸いです。

どうぞよろしくお願い致します。

Avatar
赤座 久樹

UltraDateは、全然メンテナンスされてないので使わない方が良いと僕は思ってます。(サイボウズさんのCDNからも削除してほしいくらい)

手前味噌ですが、僕がQiitaに書いたこちらの記事に他のライブラリ紹介してますので、ご参考まで。kintoneでシンプルに使うのに一番おすすめは「holiday_jp-js」ですかね。
https://qiita.com/the_red/items/43c7f88ccbba001a1a95

Avatar
柳生

赤座 様

お世話になっております。

コメント頂き、誠にありがとうございます。初心なもので大変恐縮ではございますが、

今までのソースでは

UltraDate.setHolidayOption(LOCALE,
   

のように、UltraDateを元にして設定しているのですが、この辺は「holiday_jp-js」でも対応できたりするのでしょうか?

Avatar
赤座 久樹

UltraDateは、祝日だけの目的で使っていますか?
それとも、日付の計算とか他の用途でも使っていますか?

日付目的だけであれば、UltraDateを完全に廃止して、全部holiday_jpで書き直すのが良いと思います。

日付計算全般もやっているようでしたら、祝日の処理はUltraDate使わずにholiday_jpに移行し、
祝日以外の日付計算は引き続きUltraDateでやるか、Luxonなど他のライブラリを使って行うのが良いでしょう。
https://developer.cybozu.io/hc/ja/articles/900000985463-Luxon-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6-kintone-%E3%81%AE%E6%97%A5%E4%BB%98%E3%82%84%E6%97%A5%E6%99%82%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%81%AE%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E3%82%92%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA%E3%81%99%E3%82%8B

Avatar
赤座 久樹

あ、ごめんなさい勘違いしてました。
setHolidayOptionは、自社独自の休日とかを設定できる機能ですね。
それは、holiday_jpではできないかもしれませんね。。

7/23を祝日にするのは、setHolidayOptionで行けそうですね。
7/20を同じ機能で平日にすることができれば、UltraDateのままでも行けそうですけど、どうでしょう?(この機能は使ったことないので、、、)

Avatar
柳生

赤座 様

お世話になっております。

色々とアドバイス頂き、誠にありがとうございます。

UltraDateで祝日かどうか判断し、祝日ならその日の勤務時間を時間外として計算しております。おっしゃる通し、7/23を祝日にするのは、setHolidayOptionで行けますが、逆に平日にするのができなくて、困っております(汗・・)

cybozu CDN 内のUltraDate.js の令和対応 では、サイボウズサポートセンターが対応していたようですが、今回は同じ対応はできないということでしょうか?

Avatar
赤座 久樹

今回は事情が違いそうですね。

上記の令和対応は、プログラム自体をサイボウズさんで修正されたわけではなく、

・未圧縮のUltraDate.ja.jsは元々問題なかった
・圧縮されたUltraDate.ja.min.jsにだけ問題があった
・サイボウズCDNでは問題ありのUltraDate.ja.min.jsだけが配信されていた
・依頼を受けてUltraDate.ja.jsの配信も開始された

という経緯だと思います。
GitHubにもIssueが出ていますが、圧縮前のプログラム自体は問題ないのが前回のケースでした。
https://github.com/hrdaya/UltraDate.js/issues/75

今回のスポーツの日は、そもそもプログラム自体がまだ未対応なので、サイボウズCDN側ではどうしようもありません。GitHubでプルリクは出ていますが、マージされてないですね。

https://github.com/hrdaya/UltraDate.js/pull/77

このように、オープンソースのライブラリは「作者がどれだけ頻繁にメンテナンスしてくれるか」で全然違ってくるので、残念ながらUltraDateのメンテナンス状況は、もう使わない方が良いレベルだと個人的には思います。

どうしてもUltraDateのまま行くのなら、UltraDateが元々用意している祝日情報は一切使わずに、「すべての祝日を自分で定義する」ことでしょうか…かなり面倒ではありますが。。

赤座 久樹により編集されました
Avatar
柳生

赤座 様

お世話になっております。

より詳しいご説明とわかり易いアドバイスいただき、誠にありがとうございます。

参考にさせて頂きます。

サインインしてコメントを残してください。