如何从 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);