Luxonで日付の比較をする

Luxonで日付の比較をする

項目 バージョン
Luxon 2.4.0

node.jsの日付を扱うライブラリでLuxonを使用してみます。

日付の大小比較を行います。

max()

maxの引数は可変長引数で、DateTimeを引数とします。

複数指定した引数のうち、一番未来日のDateTimeを返します。

import {DateTime, Duration} from 'luxon'

const date1 = DateTime.fromFormat('2022-06-23T01:00:00.000+09:00', 'yyyy-MM-dd\'T\'TT.SSSZZ')
const date2 = DateTime.fromFormat('2022-06-23T00:00:00.000+09:00', 'yyyy-MM-dd\'T\'TT.SSSZZ')
const date3 = DateTime.fromFormat('2022-06-22T00:00:00.000+09:00', 'yyyy-MM-dd\'T\'TT.SSSZZ')
const dt = DateTime.max(date1, date2, date3)
console.log(dt.toString()) // 2022-06-23T01:00:00.000+09:00

DateTime型の配列をmax()に渡したい場合はスプレッド演算子(…)で展開すればよいです。

const dt = DateTime.max(...[date1, date2, date3])

min()

minの引数は可変長引数で、DateTimeを引数とします。

複数指定した引数のうち、一番過去日のDateTimeを返します。

import {DateTime, Duration} from 'luxon'

const date1 = DateTime.fromFormat('2022-06-23T01:00:00.000+09:00', 'yyyy-MM-dd\'T\'TT.SSSZZ')
const date2 = DateTime.fromFormat('2022-06-23T00:00:00.000+09:00', 'yyyy-MM-dd\'T\'TT.SSSZZ')
const date3 = DateTime.fromFormat('2022-06-22T00:00:00.000+09:00', 'yyyy-MM-dd\'T\'TT.SSSZZ')
const dt = DateTime.min(date1, date2, date3)
console.log(dt.toString()) // 2022-06-22T00:00:00.000+09:00

equals()

日付が同一か求めます。

import {DateTime, Duration} from 'luxon'

const date1 = DateTime.fromFormat('2022-06-24T00:00:00.000+09:00', 'yyyy-MM-dd\'T\'TT.SSSZZ')
const date2 = DateTime.fromFormat('2022-06-23T00:00:00.000+09:00', 'yyyy-MM-dd\'T\'TT.SSSZZ')
const date3 = DateTime.fromFormat('2022-06-23T00:00:00.000+09:00', 'yyyy-MM-dd\'T\'TT.SSSZZ')
console.log(date1.equals(date2)) // false
console.log(date2.equals(date3)) // true

日付の大小比較はtoUnixInteger()を使う

日付の大小比較のメソッドがないようで、エポック秒を返すtoUnixInteger()メソッドで大小比較すればよいと思います。

DateTime同士を=== or ==で比較するとfalseとなってしまい、意図した動きになりません。(equalsメソッドを使用すればよいが)

diffメソッドはDurationを返しますし、untilメソッドはIntervalを返すので面倒です。

なので、エポック秒で比較すれば同一日も正しく比較することができます。

import {DateTime, Duration} from 'luxon'

const date1 = DateTime.fromFormat('2022-06-24T00:00:00.000+09:00', 'yyyy-MM-dd\'T\'TT.SSSZZ')
const date2 = DateTime.fromFormat('2022-06-23T00:00:00.000+09:00', 'yyyy-MM-dd\'T\'TT.SSSZZ')
const date3 = DateTime.fromFormat('2022-06-23T00:00:00.000+09:00', 'yyyy-MM-dd\'T\'TT.SSSZZ')
console.log(date1.toUnixInteger()) // 1655996400
console.log(date2.toUnixInteger()) // 1655910000
console.log(date3.toUnixInteger()) // 1655910000
console.log(date1.toUnixInteger() > date2.toUnixInteger()) // true
console.log(date1.toUnixInteger() < date2.toUnixInteger()) // false
console.log(date2.toUnixInteger() === date3.toUnixInteger()) // true

参考サイト

luxon 3.4.0 | Documentation
Immutable date wrapper

コメント

タイトルとURLをコピーしました