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