ある日付が今より何年前かを知るため、TemporalオブジェクトのPlainDateTimeオブジェクトでsince()メソッドを使い、以下のように書いて失敗する。2つも間違えているようだ。あまり関係ないがPが大文字だったり小文字だったりして間違える。
const then = Temporal.PlainDateTime.from("2020-01-01");
const now = Temporal.Now.plainDateTimeISO();
console.log(then.since(now).years); // 0
6年半くらい前なので-6.4になると思い込んでいたが、Durationオブジェクトはそういうものではないらしい。更にsince()メソッドで返ってくるDurationオブジェクトは既定で最大単位が日になっており、年や月は持っておらず、-6にもならない。365日以上前かどうかと調べても良いが、せっかく減らせた魔法の数字を使わなくてはならない。
const then = Temporal.PlainDateTime.from("2020-01-01");
const now = Temporal.Now.plainDateTimeISO();
console.log(then.since(now, {
smallestUnit: "years",
}.years); // -6
第二引数で最小単位を年にすると簡単そうだ。これでyearsプロパティーが負の整数ならば1年以上前になる(364日前では0になるし、未来の日付なら正の整数になる)。since()メソッドとuntil()メソッドがあやふやなので気を付けたい。
const then = Temporal.PlainDateTime.from("2020-01-01");
const oneYearAgo = Temporal.Now.plainDateTimeISO().subtract({
years: 1
});
console.log(then.since(oneYearAgo.sign); // -1
subtract()メソッドを使って1年前の日付を作り、signプロパティーを見るのも悪くなさそうだ。こちらの方が融通が利くかもしれない。compare()メソッドでも良いが、直感的でないコードになり、かつ長くなる。