JavaScript入門 日付と時刻を扱う
JavaScriptで日付と時刻を表すには、Dateオブジェクトを使用します。Dateオブジェクトは、協定世界時(UTC)の1979年1年1日午前0時0分0秒からの経過時間をミリ秒単位で保持しており、それによって時刻を計算します。
日付や時刻を扱うGMT、UTC、JSTとは?
GMT(Greenwich Mean Time:グリニッジ標準時)
グリニッジ標準時(GMT)とは、ロンドンにあるグリニッジ展望台を通る子午線における時刻のことで、かつては世界の標準時の基準として使われていました。GMTは、天体観測によって算出される時刻です。
UTC(Coordinated Universal Time:協定世界時)
協定世界時(UTC)は、現在、世界の標準時として使われています。UTCは原子時計(セシウム原子の振動数を基準とした時計)によって算出されるため、GMTより厳密な時刻の定義が可能です。ただし、大まかにはGMTとUTCは、ほぼ同時刻を表します。
JST(Japan Standard Time:日本標準時)
日本標準時(JST)は、協定世界時から9時間の時差があるため、UTC+9で表します。
Dateオブジェクトの作成
構文:Dateオブジェクトのインスタンス化
let 変数名 = new Date(); //➊
let 変数名 = new Date( ミリ秒 ); //➋
let 変数名 = new Date( "YYYY[-MM-DD-THH:mm:ss.sssTZD]" ); //➌
let 変数名 = new Date( 年, 月[, 日, 時, 分, 秒, ミリ秒 ] ); //➍
➊現在時刻
引数を省略した場合には、現在時刻を保持するDateオブジェクトが生成されます。取得した時刻には、GMT+0900が自動で付与されます。JavaScriptのDateオブジェクトの時刻には、PCに設定されているタイムゾーンが自動的に割り当てられています。そのため、特にタイムゾーンを指定しない場合には、PCに設定されているタイムゾーンによる現地時刻を表すことになります。
現在時刻を取得するDateオブジェクトを作成
let now = new Date();
console.log( now );
➋1970年1月1日深夜0時から経過した時刻をミリ秒で指定
1970年1月1日深夜0時からの経過時間で日時を指定するには、時間をミリ秒換算で設定します。1日分を加算しているため1970年1月2日となり、日本標準時で出力されるため+9時間が追加されて「1970年1月2日午前9時」と表示されています。
ミリ秒で時刻指定
let date = new Date( 24 * 60 * 60 * 1e3 ); //24時間 * 60分 * 60秒 * 1000ミリ秒 = 1日
console.log( date);
➌日付フォーマット文字列の使用
RFC2822またはISO8601に準拠した時刻表記で指定します。一般的にはISO8601の表記を使います。ISO8601の時刻表記にも表記のバリエーションがあります。一般的には次のフォーマットを使用します。
書式:ISO8601の日付フォーマット
YYYY-MM-DDTHH:mm:ss.sssTZD
- YYYY:年を4桁で表します。
- MM:01~12までの2桁で月を表します。
- DD:01~31までの2桁で日を表します。
- T:日付と時刻を「T」でつなげて表記します。
- HH:00~23までの2桁で時間を表します。
- mm:00~59までの2桁で分を表します。
- ss:00~59までの2桁で秒を表します。
- sss:1桁以上でミリ秒を表します。
- TZD:タイムゾーンの設定を行います。Zまたは+hh:mmまたは-hh:mmを設定できます。
- Z:Zを末尾につけるとUTC(協定世界時)を表します。
- +hh:mm|-hh:mm:UTC(協定世界時)からの相対的な経過時間を00~23の時間、00~59の分で表します。
例:
2024-10-15T02:35:00.123+0900
2024-10-15T02:35Z
2024-10-15T02:35
タイムゾーンを設定せずにDateオブジェクトを作成した場合は、現地時刻(日本の場合、+09:00)と認識されます。
ISO8601の日付フォーマットで指定
タイムゾーンなし:現地時刻(JST)
let localTime = new Date( "2024-10-15T02:35:00" );
console.log( localTime.toISOString ); //-9時間された時刻が取得される
タイムゾーンの設定なし
タイムゾーンの設定なしの場合は、現地時刻で日時が取得されます。日本標準時(JST)はUTCより9時間進んでりうため、UTCに直すと-9時間した値が表示されます。
世界標準時を指定:ZによりUTC時刻
let utcTime = new Date( "2024-10-15T02:35:00Z" );
console.log( utcTime.toISOString() ); //UTC時刻のため、変わらない
世界標準時を指定
Zを末尾に付けると、世界標準時(UTC)で時刻が取得されます。toISOStringはUTC時刻に変換しますが、すでにUTCのため、指定した時刻と同じ時刻が取得されます。
ハワイ時間を指定:-10時間によりハワイ時刻
let hawaiTime = new Date( "2024-10-15T02:35:00-10:00" );
console.log( hawaiTime.toISOString() ); //+10時間された時刻が取得される
ハワイ時間を指定
ハワイ時刻はUTCに比べて10時間遅いため、UTCに直すと+10時間された値が表示されます。
➍年月日などを引数に分けたインスタンス化
引数を分けて日時を設定
Dateオブジェクトで月を数値で表すときは、0~11までの整数で指定します。数値の0が1月、11が12月を表します。
let date = new Date( 2024,0,4,2,35,0 );
console.log( date );
Dateオブジェクトの値を取得するメソッド
Dateオブジェクトで値を取得するメソッド
メソッド | 戻り値 | 説明 |
---|---|---|
getDate() getUTCDate() | dateInt | Dateオブジェクトの日を数値で返す |
getDay() getUTCDay() | dayInt | Dateオブジェクトの曜日を数値で返す 0(日曜日)~6(土曜日) |
getMonth() getUTCMonth() | monthInt | Dateオブジェクトの月を数値で返す 0(1月)~11(12月) |
getFullYear() getUTCFUllYear() | yyyy | Dateオブジェクトの年を4桁の数値で返す |
getYear()※非推奨 | yearInt | 1900を引いた年を2桁または3桁の数値で返すが、使用禁止。 代わりにgetFullYearを使用する |
getHours() getUTCHours() | hourInt | Dateオブジェクトの時を数値で返す |
getMinutes() getUTCMinutes() | minuteInt | Dateオブジェクトの分を数値で返す |
getSeconds() getUTCSeconds() | minuteInt | Dateオブジェクトの秒を数値で返す |
getMilliseconds() getUTCMilliseconds() | msInt | Dateオブジェクトのミリ秒を数値で返す |
getTime() | ms | 1970年1月1日深夜0時からの経過時間をミリ秒で取得する |
getTimezoneOffset() | tzdOffset | 現地のタイムゾーンからUTC+0との時差を分単位の数値で取得する(JSTの場合、-540が取得される) |
toString() | datetimeStr | Dateオブジェクトの日時を文字列で返す 例: “Thu May 04 2021 18:48:59 GMT+0900″(日本標準時) |
toISOString() | datetimeStr | Dateオブジェクトの日時をISO8601表記の文字列で返す 例: “2021-05-04T09:48:59.217Z” |
toJSON | jsonStr | DateオブジェクトをJSONで使用するために文字列に変換する (toISOStringと同じ文字列が取得される) |
toDateString() | dateStr | Dateオブジェクトの年月日を文字列(dateStr)で返す 例: “The May 04 2021 |
toTimeString() | timeStr | Dateオブジェクトの現地時間を文字列で返す 例: “18:48:59 GMT+0900″(日本標準時) |
toLocaleString ([locales, options]) | datetimeStr | ロケール、オプションに合わせたDateオブジェクトの日時を文字列で返す 例: (new Date).toLocaleString( “Ja-JP”, { timeZone: “UTC” } ); > “2021/5/4 10:53:40” |
toLocaleDateString ([locales, options]) | dateStr | ロケール、オプションに合わせたDateオブジェクトの現地日付を文字列で返す。ロケール、オプションの指定方法はtoLocalStringと同じ |
toLocaleTimeString ([locales, options]) | timeStr | ロケール、オプションに合わせたDateオブジェクトの現地時間を文字列で返す。ロケール、オプションの指定方法はtoLocalStringと同じ |
toUTCString | utcDatetimeStr | Dateオブジェクトの現地時刻をUTC時刻で表す文字列(utcDatetimeStr)に変換する |
Dateオブジェクトの値を設定するメソッド
Dateオブジェクトの値を設定するときに使用するメソッド
setUTCDateのように、メソッド名にUTCが入るものはUTC時刻、UTCが入らないものは現地時刻(JSTの場合には日本標準時)で扱われます。
メソッド | 戻り値 | 説明 |
---|---|---|
setDate(dateInt) setUTCDate(dateInt) | ms(1970年1月1日深夜0時から現在までの経過時間:単位はミリ秒) | Dateオブジェクトの日を数値で設定。月末日を超える場合には、月が1繰り上げる。0を設定すると、前月の末日が取得される |
setMonth(monthInt) setUTCMonth(monthInt) | 同上 | Dateオブジェクトの月を数値で設定。0(1月)~11(12月)。11を超える場合には、年が1繰り上げる |
setFullYear(yyyy [, monthInt, dateInt]) setUTCFullYear(yyyy [, monthInt, dateInt]) | 同上 | Dateオブジェクトの年、月、日を数値で設定する |
setYear(yyyy)※非推奨 | 同上 | Dateオブジェクトの年(yyyy)を設定するが使用禁止。代わりにsetFullYearを使用する |
setHours(hourInt) setUTCHours(hourInt) | 同上 | Dateオブジェクトの時を数値で設定する。23を超える場合には、日が1繰り上げる |
setMinutes(minuteInt) setUTCMinutes(minuteInt) | 同上 | Dateオブジェクトの分を数値で設定する。59を超える場合には、時が1繰り上げる |
setSeconds(secondInt) setUTCSecond(secondInt) | 同上 | Dateオブジェクトの分を数値で設定する。59を超える場合には、分が1繰り上げる |
setMilliseconds(msInt) setUTCMilliseconds(msInt) | 同上 | Dateオブジェクトのミリ秒を数値で設定する。999を超える場合には、秒が1繰り上げる |
setTime(ms) | 同上 | 1970年1月1日深夜0時からの経過時間をミリ秒で設定する |
Dateオブジェクトの値を変更
const dt = new Date( "2024-10-01" ); //2024/10/01
dt.setDate( 4 ); //日を4日に変更
dt.setMonth(11); //月を12月に変更
console.log(dt);
console.log(dt.getDay())//曜日を確認
Dateの静的メソッド
Dateオブジェクトから直接呼び出すことができる静的メソッド
メソッド | 戻り値 | 説明 |
---|---|---|
UTC( 年, [月, 日, 時, 分, 秒, ミリ秒] ) | utcDatetime | Dateコンストラクタと同様にDateオブジェクトを生成する。ただし、UTC時刻(utcDatetime)で生成される |
now() | ms | 1970年1月1日深夜0時から現在までの経過時間をミリ秒で取得する |
parse(datetimeStr) | ms | 1970年1月1日深夜0時から日付フォーマット文字列の時刻までの経過時間をミリ秒で取得する |
日付の計算
日時XのY日後の日付を取得
指定日付の2日後の日付を取得
const now = new Date( "2024-10-01" ); //2024/10/01
const twoDaysLater = new Date( now.getFullYear(),now.getMonth(), now.getDate() +2 );//現在日時に2日を加算して新しくDateオブジェクトを生成
console.log(twoDaysLater.toDateString());
ある特定の日時(now)から相対的な日付を取得したい場合には、現在の日付(now.getDate())に値を加算します。また、この方法は、年、月、日、時、分、秒、ミリ秒にも同様に適用できます。
当月の月初、月末の取得
当月の月初、月末の取得
const date = new Date(); //2024/10/01
const firstDay = new Date( date.getFullYear(),date.getMonth(),1);//月初
console.log(firstDay.toDateString());
const lastDay = new Date( date.getFullYear(),date.getMonth() + 1,0);//月末
console.log(lastDay.toDateString());
日付の差分を求める
Dateオブジェクトが保持する値は、1970年1月1日深夜0時からの経過時間です。そのため、日付同士の差分は、ミリ秒単位の数値の差分となります。
Dateオブジェクト同士の差分日数を求める
const dayUnit = 1000 * 60 * 60 * 24; //ミリ秒 * 秒 * 分 * 時間 = 1日
const yearEnd = new Date( 2024, 10, 1); //2024/10/1
const yearBegin = new Date( 2024, 12, 1); //2024/12/1
const diffDays = Math.abs( yearEnd - yearBegin ) / dayUnit;
console.log(diffDays);