如何从JSR-310类(例如LocalDate
)计算修改过的Julian日? (在JDK 8中)
具体来说,这是continuous count of days称为“修改后的朱利安日”的计算,而不是Julian calendar system中的日期。
例如:
LocalDate date = LocalDate.now();
long modifiedJulianDay = ???
答案 0 :(得分:8)
简短回答:
LocalDate date = LocalDate.now();
long modifiedJulianDay = date.getLong(JulianFields.MODIFIED_JULIAN_DAY);
说明:
Wikipedia文章将朱利安日的最佳描述作为一个概念。简而言之,它是一个简单的,连续的,从某个时代起的天数,其中所选择的时代赋予变体名称。因此,修改后的朱利安日计为1858年至11月17日。
JSR-310日期和时间对象实现TemporalAccessor
接口,该接口定义方法get(TemporalField)
和getLong(TemporalField)
。这些允许查询特定字段时间的日期/时间对象。提供了四个字段实现,提供Julian日变化:
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);