如何从诸如LocalDate的JSR-310类计算出儒略日? (在JDK 8中)

具体来说,这是对continuous count of days的计算,称为“Modified Julian day”,而不是Julian calendar system中的日期。

例如:

LocalDate date = LocalDate.now();
long modifiedJulianDay = ???

最佳答案

简短答案:

LocalDate date = LocalDate.now();
long modifiedJulianDay = date.getLong(JulianFields.MODIFIED_JULIAN_DAY);

解释:

Wikipedia文章最好地描述了朱利安·戴(Julian day)这个概念。简而言之,它是从某个纪元开始的简单,连续的天数,其中选定的纪元为变体起了名字。因此,儒略日的修改日期为1858-11-17。

JSR-310日期和时间对象实现了 TemporalAccessor 接口(interface),该接口(interface)定义了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:get()方法的字段ModifiedJulianDay无效,请改用getLong()”。

    请注意,JSR-310只能提供来自 TemporalField 的整数,因此无法表示时间,这些数字均基于午夜。该计算还使用本地午夜时间,而不是UTC,应将其考虑在内。

    这些字段还可以用于使用 Temporal 上的方法来更新日期/时间对象:
    result = input.with(JulianFields.MODIFIED_JULIAN_DAY, 56685);
    

    10-07 14:13