JavaScript Dateメモ
全般
-
時刻値 (time value) は、epoch(1970-01-01T00:00:00.000Z)からの経過ミリ秒を示す整数値として保持される。
> new Date(0) 1970-01-01T00:00:00.000Z > new Date(1) 1970-01-01T00:00:00.001Z -
epochより過去は負の時刻値として表現される。
> new Date(-1000) 1969-12-31T23:59:59.000Z -
時刻値にうるう秒は表現されない。例えば2016-12-31T23:59:60Zを示す時刻値は存在しない。
> new Date(1483228799999) 2016-12-31T23:59:59.999Z > new Date(1483228800000) 2017-01-01T00:00:00.000Z > new Date('2016-12-31T23:59:60Z').getTime() NaN -
既存Dateオブジェクトの時刻値は、
getTime()またはvalueOf()で取得できる。getTime()とvalueOf()は同じ結果を返す。> new Date('2023-01-01T00:00:00.000Z').valueOf() 1672531200000 > new Date('2023-01-01T00:00:00.000Z').getTime() 1672531200000 -
標準の日時文字列書式は
YYYY-MM-DDTHH:mm:ss.sssZ
タイムゾーン
-
オブジェクトの持つタイムゾーン情報は、ローカルシステムのタイムゾーンとなる。オブジェクト生成時に指定したタイムゾーンは保持されない。
> const dateFromUtc = new Date('2023-01-02T03:04:05.678Z') undefined > const dateFromJst = new Date('2023-01-02T12:04:05.678+09:00') undefined > dateFromUtc.getHours() 12 > dateFromJst.getHours() 12 > dateFromUtc.toISOString() '2023-01-02T03:04:05.678Z' > dateFromJst.toISOString() '2023-01-02T03:04:05.678Z' > dateFromUtc.getTimezoneOffset() -540 > dateFromJst.getTimezoneOffset() -540 > dateFromUtc.getTime() === dateFromJst.getTime() true -
Dateオブジェクト生成時にタイムゾーン無しの日時文字列を渡すと、ローカルタイムの時刻とみなされる。混乱をなくすためには必ずタイムゾーンを明示すべき。> new Date('2023-01-01T00:00:00').toISOString() // タイムゾーン指定なし '2022-12-31T15:00:00.000Z' > new Date('2023-01-01T00:00:00Z').toISOString() // UTC指定 '2023-01-01T00:00:00.000Z' > new Date('2023-01-01T00:00:00+09:00').toISOString() // +09:00指定 '2022-12-31T15:00:00.000Z' -
getTimezoneOffset()が返すUTCオフセット(分単位の整数)は、ISO 8601のUTCオフセット表記とは正負が逆になる。例えば日本標準時(+09:00)の場合-540となる。> new Date().getTimezoneOffset() -540 -
Dateオブジェクトの時刻情報アクセスメソッドには、UTCベースの
getUTCXxx(),setUTCXxx()と、タイムゾーンを考慮したローカルタイムベースのgetXxx(),setXxx()がある。 -
getDate()は day of month (0 - 31) を返す。getDay()は曜日(0=Sun - 6=Sat)を返す。
型変換
-
Date -> number 変換:
Date.prototype.valueOf()または、Date.prototype.getTime()> new Date('2023-01-01T00:00:00.000Z').valueOf() 1672531200000 -
number -> Date 変換:
new Date(number)> new Date(1672531200000) 2023-01-01T00:00:00.000Z -
Date -> string 変換:
Date.prototype.toISOString()> new Date(1672531200000).toISOString() '2023-01-01T00:00:00.000Z' -
string -> Date 変換:
new Date(string)> new Date('2023-01-01T00:00:00.000Z') 2023-01-01T00:00:00.000Z