【JavaScript】日付を扱いたい? getMonth には気をつけろ!

投稿日: 2023/12/31
更新日: 2023/12/31
シェア:

URL copied!


概要

日付を用いたコードを書きたいときに気をつけたいポイント。
最後に時計表示のサンプルあります。

日付を扱う

値の取得

ローカル

関数 備考
getFullYear() getYear() は非推奨になりましたのでこっちを使いましょう。
getMonth() 注意! 0 を基点とした値が出るので +1 して正しい月となる。
getDate()
getDay() 曜日 日 -> 土 / 0 -> 6で出力
getHours()
getMinutes()
getSeconds()
getMilliseconds() ミリ秒 0 から 999 までの間の数値。4桁目から切り捨てられる。

getMonth だけ感覚と異なるのでそのまま使わないように注意!
曜日は cron と同じですね。

UTC

関数
getUTCFullYear()
getUTCMonth()
getUTCDate()
getUTCDay() 曜日
getUTCHours()
getUTCMinutes()
getUTCSeconds()
getUTCMilliseconds() ミリ秒

値を設定

ローカル

関数 設定する値 備考
setFullYear 年、月、日 年は必須
setMonth 月、日 月は0~11
setDate 1~31
setHours 時間、分、秒、ミリ秒
setMinutes 分、秒、ミリ秒
setSeconds 秒、ミリ秒
setMilliseconds ミリ秒
setTime UNIXエポックからのミリ秒

UTC

関数 設定する値
setUTCFullYear 年、月、日
setUTCMonth 月、日
setUTCDate
setUTCHours 時間、分、秒、ミリ秒
setUTCMinutes 分、秒、ミリ秒
setUTCSeconds 秒、ミリ秒
setUTCMilliseconds ミリ秒

フォーマット

関数 フォーマット例 タイムゾーン 備考
toDateString 日付 Thu Apr 01 2023 Local
toLocaleDateString 日付 Monday, May 1, 2023
or
2023年5月1日月曜日
Local ロケールに依存する形式の文字列に変換
toLocaleString 日付, 時刻 01/05/2023, 03:00:00
or
2023/5/1 3:00:00
Local ロケールに依存する形式の文字列に変換
toLocaleTimeString 時刻 6:10:23 AM
or
06:10:23
Local ロケールに依存する形式の文字列に変換
toString 日付, 時刻 Thu Apr 01 2023 21:00:00 GMT+0900 (日本標準時) Local
toTimeString 時刻 21:00:00 GMT+0900 (日本標準時) Local
toISOString 日付, 時刻 2023-04-01T12:00:00.000Z UTC ISO 8601形式の文字列に変換
toJSON 日付, 時刻 2023-04-01T12:00:00.000Z UTC JSON形式で使える文字列に変換 (toISOStringを使用)
toUTCString 日付, 時刻 Thu, 01 Apr 2023 12:00:00 GMT UTC

サンプル

値の取得

2023/12/31 は日曜日です。

var date1 = new Date('December 31, 2023 22:10:12.1235');
var date2 = new Date('December 31, 2023 22:10:12.1235 GMT+0900');
var date3 = new Date('December 31, 2023 22:10:12.1235Z');

出力

関数 date1 date2 date3
getFullYear 2023 2023 2024
getMonth 11 11 0
getDate 31 31 1
getDay 0 0 1
getHours 22 22 7
getMinutes 10 10 10
getSeconds 12 12 12
getMilliseconds 123 123 123

Chrome で実施しましたが、タイムゾーンなしはローカルタイムゾーンの文字列であると判断するそうです。
ただ、サーバーからUTCだと思って渡した文字列がローカルタイムと解釈されてしまったら困りますので扱い注意ですね

時計

上記を元に時計を作ってみました。
Chrome だと以下のようにしてタイムゾーンを任意に変更できますので変化をお楽しみください。
(ミリ秒単位であわせていませんので、実際の時計より今のままだと若干遅れます。)

コード

<div id="currentTime"></div>
<script>
    function updateClock() {
        var d = new Date();
        var offsetTime = d.getTimezoneOffset() / -60;
        var timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;

        var now = new Date();
        now.setHours(now.getUTCHours() + offsetTime);
        var year = String(now.getFullYear());
        var month = String(now.getMonth() + 1).padStart(2, '0');
        var day = String(now.getDate()).padStart(2, '0');
        var hours = String(now.getHours()).padStart(2, '0');
        var minutes = String(now.getMinutes()).padStart(2, '0');
        var seconds = String(now.getSeconds()).padStart(2, '0');

        var formattedTime = year + '/' + month + '/' + day + ' ' + hours + ':' + minutes + ':' + seconds + ' (' + timeZone + ')';
        document.getElementById('currentTime').innerText = formattedTime;
    }
    setInterval(updateClock, 1000);
    updateClock();
</script>

おわりに

ブラウザに時間の計算をさせる場合や、サーバーから日付の文字列を渡す場合はタイムゾーンを付けて誤った値にならないように注意したいですね。
また、テストする際も、タイムゾーンによって日付がずれたりしないか確認することも重要です。