如何从 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
定义方法的接口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,应将其考虑在内。
这些字段还可用于使用以下方法更新日期/时间对象Temporal
:
result = input.with(JulianFields.MODIFIED_JULIAN_DAY, 56685);