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.5.0 | Documentation
Immutable date wrapper

KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^
コメント