2014-01-28 1 views
6

Как рассчитать модифицированный юлианский день из класса JSR-310, например LocalDate? (в JDK 8)Рассчитать измененный юлианский день в JSR-310

В частности, это расчет continuous count of days, известный как «Измененный юлианский день», а не дата в Julian calendar system.

Например:

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

ответ

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 - вариация в полночь на основе стандартного Julian день концепции
  • JulianFields.RATA_DIE - вариации Джулиан день на основе григорианская общая эпоха
  • ChronoField.EPOCH_DAY - это Julian изменения дня на основе стандартного Java/UNIX 1970-01-01

Эти поля могут использоваться только с getLong(TemporalField), потому что они возвращают число, которое слишком велико для int. Если вы звоните now.get(JulianFields.MODIFIED_JULIAN_DAY) тогда будет сгенерировано исключение: «UnsupportedTemporalTypeException: метод Недопустимое поле ModifiedJulianDay для ГЭТ(), используйте getLong() вместо»

Заметьте, что JSR-310 может обеспечить только целые числа от TemporalField, таким образом, с временем день не может быть представлен, и все цифры основаны на полуночи. В расчетах также используется локальная полуночи, а не UTC, которые следует учитывать.

поля также могут быть использованы для обновления даты/времени объекта с использованием метода на Temporal:

result = input.with(JulianFields.MODIFIED_JULIAN_DAY, 56685); 
+1

Знаете ли вы, как преобразовать это наоборот? От измененной даты Julian до LocalDate? – Keros

+1

LocalDate date = LocalDate.MIN.with (JulianFields.MODIFIED_JULIAN_DAY, 56685); – JodaStephen