如何从 JSR-310 类计算修改后的儒略日,例如LocalDate
? (在 JDK 8 中)
具体来说,这是计算连续计算天数 http://en.wikipedia.org/wiki/Julian_day被称为“修改儒略日”,而不是日期儒略历系统 http://en.wikipedia.org/wiki/Julian_calendar.
例如:
LocalDate date = LocalDate.now();
long modifiedJulianDay = ???
简短回答:
LocalDate date = LocalDate.now();
long modifiedJulianDay = date.getLong(JulianFields.MODIFIED_JULIAN_DAY);
解释:
The 维基百科 http://en.wikipedia.org/wiki/Julian_day文章对儒略日这个概念进行了最好的描述。简而言之,它是对某个纪元的简单、连续的天数计数,所选纪元为该变体命名。因此,修正儒略日从 1858 年 11 月 17 日开始计算。
JSR-310 日期和时间对象实现TemporalAccessor http://download.java.net/jdk8/docs/api/java/time/temporal/TemporalAccessor.html定义方法的接口get(TemporalField)
and getLong(TemporalField)
。这些允许查询特定的日期/时间对象field的时间。提供了四种现场实现,提供儒略日变化:
-
JulianFields.MODIFIED_JULIAN_DAY http://download.java.net/jdk8/docs/api/java/time/temporal/JulianFields.html#MODIFIED_JULIAN_DAY- 标准修改儒略日
-
JulianFields.JULIAN_DAY http://download.java.net/jdk8/docs/api/java/time/temporal/JulianFields.html#JULIAN_DAY- 标准儒略日概念的基于午夜的变体
-
JulianFields.RATA_DIE http://download.java.net/jdk8/docs/api/java/time/temporal/JulianFields.html#RATA_DIE- 基于公历共纪元的儒略日变体
-
ChronoField.EPOCH_DAY http://download.java.net/jdk8/docs/api/java/time/temporal/ChronoField.html#EPOCH_DAY- 基于标准 Java/UNIX 1970-01-01 的儒略日变体
这些字段只能与getLong(TemporalField)
因为它们返回的数字对于int
。如果你打电话now.get(JulianFields.MODIFIED_JULIAN_DAY)
那么将抛出异常:“UnsupportedTemporalTypeException:get() 方法的 ModifiedJulianDay 字段无效,请改用 getLong()”
请注意,JSR-310 只能提供以下整数:TemporalField http://download.java.net/jdk8/docs/api/java/time/temporal/TemporalField.html,因此无法表示一天中的时间,并且数字均基于午夜。计算还使用当地午夜,而不是 UTC,这一点应该考虑在内。
这些字段还可以用于使用以下方法更新日期/时间对象Temporal http://download.java.net/jdk8/docs/api/java/time/temporal/Temporal.html:
result = input.with(JulianFields.MODIFIED_JULIAN_DAY, 56685);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)