アプリを開発する上で日付を扱うことは多いと思います。
色々検索していてTypeScriptで時間は気にせず単純に日付のみを比較して差分を計算してくれるサンプルプログラムが無いなと感じたので自分で作成してみました。
今回はTypeScriptで今日を基準にして、
- 指定日が今日であれば「今日が指定日です!」
- 指定日が未来日であれば「指定日まであと〇〇日です!」
- 指定日が過去日であれば「指定日から〇〇日経過しました!」
と表示させるプログラムを紹介します。
目次
日付差分計算のサンプルプログラム
const formatDate = (date: Date): string => {
const y: number = date.getFullYear();
const m: string = ("00" + (date.getMonth() + 1)).slice(-2);
const d: string = ("00" + date.getDate()).slice(-2);
return `${y + "-" + m + "-" + d}`;
};
const setDate: Date = new Date('2021-12-25');
const nowDate: Date = new Date(formatDate(new Date()));
let resWord = "";
const diffDay: number = Math.floor((nowDate.getTime() - setDate.getTime()) / 86400000);
if (diffDay === 0) {
resWord = "今日が指定日です!";
} else if (0 > diffDay) {
resWord = `指定日まであと${Math.abs(diffDay)}日です!`;
} else {
resWord = `指定日から${diffDay}日経過しました!`;
}
console.log(resWord);
簡単に解説
const formatDate = (date: Date): string => {
const y: number = date.getFullYear();
const m: string = ("00" + (date.getMonth() + 1)).slice(-2);
const d: string = ("00" + date.getDate()).slice(-2);
return `${y + "-" + m + "-" + d}`;
};
引数で渡されたDate型のタイムスタンプからstring型のyyyy-mm-ddで返す関数です。
getFullYearメソッドで西暦のみを取得、getMonthメソッドで月のみを取得、getDateメソッドで日付のみを取得しています。
const setDate: Date = new Date('2021-12-25');
const nowDate: Date = new Date(formatDate(new Date()));
let resWord = "";
setDateにはDateオブジェクトをインスタンス化して引数に任意の日付をyyyy-mm-dd形式で指定します。
nowDateにもDateオブジェクトをインスタンス化して引数にformatDateから返された今日のyyyy-mm-ddを指定します。
const diffDay: number = Math.floor((nowDate.getTime() - setDate.getTime()) / 86400000);
Math.floorメソッドは引数内で割った値の少数点以下を切り捨てた値を取得することができます。
getTimeメソッドは指定のタイムスタンプをミリ秒に変換した結果を取得できます。
まずnowDateのミリ秒からsetDateのミリ秒を引き算すると今日を基準に指定日が何日離れているかをミリ秒で計算できます。
その後そのミリ秒を日数に変換しています。
ミリ秒を日数に変換するには
1000(ミリ秒) × 60(秒) × 60(分) × 24(時間) = 86400000
で割ると変換可能です。
割った結果をMath.floorメソッドで小数点以下を切り捨てた結果、diffDayには今日と指定日の日数差分が格納されます。
if (diffDay === 0) {
resWord = "今日が指定日です!";
} else if (0 > diffDay) {
resWord = `指定日まであと${Math.abs(diffDay)}日です!`;
} else {
resWord = `指定日から${diffDay}日経過しました!`;
}
あとは条件分岐して出力するだけです。
Math.absメソッドは引数の値をnumber型の絶対値に変換してくれます。
結果、
- diffDayが「0」なら「今日が指定日です!」
- 指定日が今日より大きければ「指定日まであと〇〇日です!」
- あとのパターンは指定日が今日より小さいしか無いので「指定日から〇〇日経過しました!」
という感じで出力されます。
おわりに
ここまでつらつらとプログラムの解説をしてきました。
このプログラムのメリットは冒頭でyyyy-mm-dd形式からDate型オブジェクトを作成しているので時間を考慮せず単純に日付だけを計算できている点だと思います。
もっと効率よく同じ処理を書けるよなどあればぜひコメントで教えて欲しいです。勉強させていただきます。
このブログでは他にも初心者向けにプログラミング言語に関しての記事を上げているのでよければそちらもどうぞー
【Python初心者向け】形態素解析とマルコフ連鎖を使ってひろゆきっぽい文章を生成してみた【Flutter】Dartの基礎構文とサンプルコード