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