Как преобразовать григорианскую дату в юлианскую дату с помощью Java 8 Date/Time API?

У меня есть дата в григорианском календаре, и я хочу найти тот же день в юлианском календаре.

Это должно быть легко с API даты/времени Java 8, но я не мог найти способ сделать это. Код должен выглядеть примерно так:

/*
 * LocalDate uses the Gregorian calendar
 */
LocalDate date = LocalDate.parse("2017-10-29");


/*
 * switch from Gregorian calendar to Julian calendar here
 */
;


/*
 * output should be 2017-10-16
 */
System.out.println(date);

Вы можете попробовать его онлайн здесь


Изменить

Это, конечно, не дубликат преобразования из григорианского в юлианский календарь. Мой вопрос касается конкретно Java Data/Time API.


person Paule    schedule 29.10.2017    source источник
comment
Проверьте это: coderanch.com/t/410264/java/Julian-Gregorian -дата-преобразование   -  person Omar Mneimneh    schedule 29.10.2017
comment
Возможный дубликат преобразования из григорианского в юлианский календарь   -  person    schedule 29.10.2017
comment
@Hugo, это очень плохой дубликат, поскольку ни вопрос, ни ответы не используют API времени Java8 Java. И удаление языкового тега [java] в вашем редактировании также было плохой идеей - java-8 не является языковым тегом.   -  person Erwin Bolwidt    schedule 29.10.2017
comment
Итак, вернемся к теме. Я не понимаю, почему вы не можете взять логику из другого вопроса до второго создания объекта календаря и заменить его на LocalDate   -  person OneCricketeer    schedule 29.10.2017
comment
Код использует возможно небезопасную логику преобразования. Я хочу избежать этого, если есть лучшая альтернатива.   -  person Paule    schedule 29.10.2017
comment
Возможно, юлианская хронология определила Может помочь проект ThreeTen-Extra, набор классов в дополнение к классам java.time.   -  person Basil Bourque    schedule 29.10.2017
comment
@Hugo Я четко указал, как я хотел бы решить проблему в самом вопросе и в тексте. С какой дополнительной целью я должен объяснять, как я хочу, чтобы проблема не решалась? Вопрос может показаться, что я не прилагаю никаких усилий, но верно и обратное. Ради полезного вопроса постарался исключить все, что не имеет отношения к пониманию или решению проблемы.   -  person Paule    schedule 29.10.2017
comment
Вы сказали, что хотите переключиться с григорианского на юлианский календарь в Java 8. Дубликат содержит алгоритм, который можно адаптировать для использования с Java 8 LocalDate - поскольку вы не указали конкретно, я подумал, что его можно использовать. Если бы вы сказали, что не хотите заниматься математикой самостоятельно и вместо этого использовать встроенную функцию API, я бы не предложил дублировать. В любом случае, если вы не хотите, чтобы вопрос выглядел так, будто он не требует никаких усилий, приложите усилия к вопросу. Мы не сможем догадаться, что вы пробовали, если вы нам не расскажете.   -  person    schedule 29.10.2017


Ответы (2)


Юлианская хронология не встроена в Java 8 или 9. Вместо этого в проекте ThreeTen-Extra JulianChronology и JulianDate. Использовать его просто.

JulianDate jd = JulianDate.from(localIsoDate);
person JodaStephen    schedule 29.10.2017
comment
Здорово. Спасибо большое. - person Paule; 30.10.2017

Я, как и @Hugo, думаю, что ваши исследования могли бы быть лучше.

Поддерживает ли Java-8/9 юлианский календарь?

Метод исследования: изучите официальный API.

Количество хронологий в OpenJDK ограничено только пять (см. упомянутые реализации). Никакая хронология (ИСО как пролептический григорианский, хиджра-умалькуара, минго, тайский буддизм, японский) не поддерживает юлианский календарь. Отсюда простой ответ: Нет возможности конвертации в юлианский календарь только с использованием Java-8/9-API.

Планирует ли Oracle внедрить юлианский календарь?

Метод исследования: запрос Google.

Простой поиск в Google по ключевым словам «юлианский календарь openjdk» показывает первую ссылку следующую проблему< /а>:

Юлианская календарная система была основной календарной системой, использовавшейся до нынешней григорианской/ISO. Из-за его широкого исторического использования, особенно в области истории/академии, JDK должен его поддерживать.

Реализация доступна на сайте ThreeTen-Extra. Обратите внимание, что эта проблема не требует календаря, который может «переключаться» между юлианским и григорианским.

Этот вопрос был представлен основным автором нового java.time-API С. Колеборном еще в 2015 году. У Oracle было много времени, чтобы добавить предложенную законченную реализацию в Java-9, но она упустила его. Что касается того факта, что Oracle отказался от некоторых других календарных систем (таких как персидский или иврит) или даже выбросил существующие хронологии (например, коптский, который был частью OpenJDK-8 перед выпуском), я не был бы очень уверен, что Oracle действительно собирается добавить юлианский календарь в более позднюю версию Java в контексте java.time-API. Давайте посмотрим.

Можем ли мы использовать другие сторонние библиотеки для преобразования java.time.LocalDate?

Метод исследования: запрос Google.

Простой поиск в Google по ключевым словам «юлианский календарь Java» показывает массу возможных решений. Просто наберитесь терпения и изучите хотя бы ссылки первых 10 страниц результатов поиска:

Да, можем.

LocalDate threeten = LocalDate.now();
org.joda.time.LocalDate joda =
  new DateTime(
      threeten.getYear(),
      threeten.getMonthValue(),
      threeten.getDayOfMonth(),
      0,
      0
  ).withChronology(JulianChronology.getInstance()).toLocalDate();
  • Или используйте Threeten-Extra ( уже предложено С. Колебурном в выпуске OpenJDK и его ответом здесь, на SO, который также показывает простое преобразование).

  • Или используйте мою библиотеку Time4J, которая предлагает даже два разных календаря: JulianCalendar и HistoricCalendar (последний имеет настраиваемый ChronoHistory для нерегулярных юлианских високосных лет между 44 г. до н.э. и 8 г. н.э. см. класс AncientJulianLeapYears). Пример преобразования:

LocalDate threeten = LocalDate.now();
JulianCalendar jcal = PlainDate.from(threeten).transform(JulianCalendar.axis());
person Meno Hochschild    schedule 30.10.2017
comment
1. Я изучил API и не увидел JulianChronology. Но я не пришел к выводу, что нельзя использовать java.time. Я знал, что GregorianCalendar можно использовать для обработки дат по юлианскому календарю и что в API java.time есть класс JulianFields. Так что я подумал, что может быть простой способ без юлианской хронологии. Но точно: изучите достаточно, и вам больше не придется спрашивать. - person Paule; 09.11.2017
comment
2. Если бы я был уверен, что нет возможности использовать java.time, я бы задал этот вопрос. 3. Если бы я был уверен, что нет никакого способа использовать java.time, я бы явно искал библиотеки. - person Paule; 09.11.2017
comment
Но я попытался выйти из нескольких поисков, таких как convert .. from .. to в Java 8, не наткнувшись на проекты Threeten-Extra или Time4J. - person Paule; 09.11.2017
comment
@Paule Ну, может быть, я был слишком строг, потому что существование класса JulianFields многие люди часто ошибочно принимают за то, что верят в поддержку юлианского календаря, но обе вещи совершенно разные (юлианские поля сами по себе не являются календарем, а обычным способом непрерывного счета в днях для любого календаря). Здесь название действительно вводит в заблуждение. - person Meno Hochschild; 09.11.2017