疲れたらやすむ

Javaを学ぶ上でハマったところを書いていきます。iPhoneアプリ開発や日常ネタもあるかも。

【JavaScript】Dateの日付操作

今回はDateについて。

Javaから始めた身なので、JavaScriptのDateは良いような悪いような・・・というイメージがあります。
どっちつかずなんですが。

Dateの使い方

基本的な使い方から。

ソース

var date = new Date();
console.log(date);

実行結果

Tue Sep 03 2019 19:27:30 GMT+0900 (日本標準時) 

new Date()で現在日時の取得が出来ます。

これだけだと実用性は低いので、ここからフォーマットを指定して日時を表示したり、時間だけを表示したりするわけですね。

このあたりはサクッといっちゃいましょう。

時間や分などを個別で取得

ソース

var date = new Date(); // Tue Sep 03 2019 22:38:15 GMT+0900 (日本標準時) 

date.getFullYear(); // 2019
date.getMonth(); // 8
date.getDate(); // 3
date.getHours(); // 22
date.getMinutes(); // 38
date.getSeconds(); // 15

注意するのは月の取得ぐらいですかね。
月だけは-1された状態で取得するので、今月を表示させたいときは

date.getMonth() + 1; // 9

とする必要があります。

フォーマットを指定して日時を表示する

ソース

var date = new Date();
console.log(dateFormat(date));

function dateFormat(date) {
  format = "YYYY/MM/DD hh:mm:dd";
  format = format.replace(/YYYY/g, date.getFullYear());
  format = format.replace(/MM/g, date.getMonth() + 1);
  format = format.replace(/DD/g, date.getDate());
  format = format.replace(/hh/g, date.getHours());
  format = format.replace(/mm/g, date.getMinutes());
  format = format.replace(/dd/g, date.getSeconds());
  return format;
}

実行結果

2019/9/3 22:29:54 

こんな感じになってしまうんですかね。
formatに対して値を置換していくイメージですね。
JavaであればSimpleDateFormatで1発!って感じなのですが。


正直、この程度のフォーマットなら

ソース

var date = new Date();
console.log(dateFormat(date));

function dateFormat(date) {
  return date.getFullYear() + "/" + (date.getMonth() + 1) + "/" + date.getDate();
}

実行結果

2019/9/3 

みたいな感じでもアリかな〜と思っちゃいますよね。
もちろんフォーマット使っている方が可読性もありますしそれっぽくて見栄えは良いですけどね。

日付の加算・減算

ソース

var date = new Date();
console.log(date);

date.setDate(date.getDate() + 1);
console.log(date);

実行結果

Tue Sep 03 2019 23:25:41 GMT+0900 (日本標準時) 
Wed Sep 04 2019 23:25:41 GMT+0900 (日本標準時) 

加算したいセッターに、加算する値を取得するゲッター+加算する数値でOKです。

減算は+をーに変えればOKです。

ソース

var date = new Date();
console.log(date);

date.setDate(date.getDate() - 1);
console.log(date);

実行結果

Tue Sep 03 2019 23:25:41 GMT+0900 (日本標準時) 
Mon Sep 02 2019 23:25:41 GMT+0900 (日本標準時) 


そして、月末の日付に対し1日加算した場合どうなるか?なのですが。

ソース

var date = new Date();
date.setDate(0);
console.log(date);

date.setDate(date.getDate() + 1);
console.log(date);

実行結果

Sat Aug 31 2019 23:34:22 GMT+0900 (日本標準時) 
Sun Sep 01 2019 23:34:22 GMT+0900 (日本標準時) 

ちゃんと自動で判断して計算してくれますので使い勝手は良いです。

よく使う日付操作

ソース

var date = new Date();
console.log("本日 : " + dateFormat(date));

var yesterday = new Date(date.getFullYear(), date.getMonth(), date.getDate() - 1);
console.log("昨日 : " + dateFormat(yesterday));

var weekAgo = new Date(date.getFullYear(), date.getMonth(), date.getDate() - 7);
console.log("1週間前 : " + dateFormat(weekAgo));

var monthStart = new Date(date.getFullYear(), date.getMonth(), 1);
console.log("月初 : " + dateFormat(monthStart));

var monthEnd = new Date(date.getFullYear(), date.getMonth() + 1, 0);
console.log("月末 : " + dateFormat(monthEnd));

var monthAgo = new Date(date.getFullYear(), date.getMonth() - 1, date.getDate());
console.log("先月 : " + dateFormat(monthAgo));

function dateFormat(date) {
  var format = "YYYY/MM/DD";
  format = format.replace(/YYYY/g, date.getFullYear());
  format = format.replace(/MM/g, date.getMonth() + 1);
  format = format.replace(/DD/g, date.getDate());
  return format;
}

実行結果

本日 : 2019/9/4 
昨日 : 2019/9/3 
1週間前 : 2019/8/28 
月初 : 2019/9/1 
月末 : 2019/9/30 
先月 : 2019/8/4 

月の加減算については月ごとに末日の日付が違う可能性が高いので、確実に月が-1されないケースもあります。

例えばこういうパターン。

ソース

var date = new Date(2019, 9,31);
console.log("今月 : " + dateFormat(date));

var monthAgo = new Date(date.getFullYear(), date.getMonth() - 1, date.getDate());
console.log("先月 : " + dateFormat(monthAgo));

function dateFormat(date) {
  var format = "YYYY/MM/DD";
  format = format.replace(/YYYY/g, date.getFullYear());
  format = format.replace(/MM/g, date.getMonth() + 1);
  format = format.replace(/DD/g, date.getDate());
  return format;
}

実行結果

今月 : 2019/10/31
先月 : 2019/10/1

正しいような正しくないような。
とりあえずこういうケースがあるということは頭に入れておいた方が良いと思います。