などの JSR-310 クラスから修正ユリウス日を計算するにはどうすればよいLocalDate
ですか? (JDK 8)
具体的には、これはユリウス暦システムの日付ではなく、「修正ユリウス日」として知られる連続した日数の計算です。
例えば:
LocalDate date = LocalDate.now();
long modifiedJulianDay = ???
簡潔な答え:
LocalDate date = LocalDate.now();
long modifiedJulianDay = date.getLong(JulianFields.MODIFIED_JULIAN_DAY);
説明:
ウィキペディアの記事は、ユリウス日を概念として最もよく説明しています。簡単に言えば、あるエポックからのシンプルで連続的な日数であり、選択されたエポックがバリエーションにその名前を与えます。したがって、修正ユリウス日は 1858 年 11 月 17 日からカウントされます。
JSR-310 の日付と時刻のオブジェクトは、メソッドとTemporalAccessor
を定義するインターフェースを実装します。これらを使用すると、特定の時間フィールドについて日付/時刻オブジェクトを照会できます。ユリウス日のバリエーションを提供する 4 つのフィールド実装が提供されます。get(TemporalField)
getLong(TemporalField)
JulianFields.MODIFIED_JULIAN_DAY
- 標準の修正ユリウス日JulianFields.JULIAN_DAY
- 標準的なユリウス日の概念の真夜中ベースのバリエーションJulianFields.RATA_DIE
- グレゴリオ暦の紀元に基づくユリウス日のバリエーションChronoField.EPOCH_DAY
- 標準 Java/UNIX 1970-01-01 に基づくユリウス日変動getLong(TemporalField)
これらのフィールドは、 では大きすぎる数値を返すため、でのみ使用できますint
。呼び出すとnow.get(JulianFields.MODIFIED_JULIAN_DAY)
、例外がスローされます: 「UnsupportedTemporalTypeException: Invalid field ModifiedJulianDay for get() method, use getLong() instead.」
JSR-310 は からの整数のみを提供できることに注意してくださいTemporalField
。したがって、時刻を表すことはできず、数値はすべて真夜中に基づいています。計算では、UTC ではなく現地の午前 0 時も使用されるため、考慮に入れる必要があります。
フィールドは、メソッド on を使用して日付/時刻オブジェクトを更新するためにも使用できますTemporal
。
result = input.with(JulianFields.MODIFIED_JULIAN_DAY, 56685);