Преобразование даты по юлианскому календарю в дату Java, но по-прежнему не удается получить месяц

Я пытаюсь получить день, месяц и год с даты по юлианскому календарю.

    String date = "13136";//Julian date
    Date convertedDate = new SimpleDateFormat("yyDDD").parse(date);
    System.out.println(convertedDate);

Он печатает

Thu May 16 00:00:00 BST 2013

что правильно.

Теперь я хочу получить от него Day , Month и Year

  Calendar cal = Calendar.getInstance();
  cal.setTime(convertedDate);
  System.out.println(cal.get(Calendar.MONTH));


It prints 4 .

Должно быть напечатано 5 вместо 4 . Почему это не печатает как правильно? Что я здесь сделал не так?


person Makky    schedule 16.05.2013    source источник


Ответы (3)


Согласно javadoc Calendar.MONTH:

Номер поля для получения и установки с указанием месяца. Это значение, зависящее от календаря. Первый месяц года в григорианском и юлианском календарях - ЯНВАРЬ, что равно 0; последнее зависит от количества месяцев в году.

Таким образом, месяцы начинаются с нуля, поэтому ваш вывод 4 верен, для общего варианта использования в вашем коде было бы безопасно добавить к нему 1, если только вы снова не используете эти значения как значение MONTH в Calendar.

person harsh    schedule 16.05.2013
comment
Это имеет смысл. Спасибо, мой друг. - person Makky; 16.05.2013

Как указано в javadocs, месяцы начинаются с нуля: 0 = январь, 1 = февраль и так далее.

person karakuricoder    schedule 16.05.2013

tl;dr

LocalDate.parse ( 
    "13136", 
    DateTimeFormatter.ofPattern ( "uuDDD" ) 
).getMonthValue()

5

…за май месяц 2013 года.

Порядковый, а не юлианский

Ваше использование слова «Юлиан» технически неверно, хотя и распространено. Люди, кажется, путают день года (1-365 или 1-366) с практикой подсчета количества дни, прошедшие с 1 января 4713 г. до н.э., используемые в некоторых научных областях.

Более понятны термины "порядковая дата" или день года.

ИСО 8601

Ваш формат порядковых дат не является стандартным. По возможности используйте стандартные форматы ISO 8601:

  • ГГГГ-ДДД
  • ГГГГДДД

Java.время

Современный способ - это классы java.time, которые заменяют проблемные старые устаревшие классы даты и времени.

DateTimeFormatter

Обратите внимание, что коды шаблонов форматирования в DateTimeFormatter похож на унаследованный класс, но не совсем на некоторые.

String input = "13136";  //Julian date
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "uuDDD" );

LocalDate

Класс LocalDate представляет значение без времени суток и без часового пояса.

LocalDate localDate = LocalDate.parse ( input, f );

Дамп на консоль.

System.out.println ("localDate: " + localDate );

местнаяДата: 16 мая 2013 г.

Month

Вы можете спросить о месяце этого LocalDate. Перечисление Month предварительно определяет дюжину объектов, по одному на каждый месяц года. И в отличие от сумасшедших устаревших классов, эти классы разумно пронумерованы с 1 по 12 за январь-декабрь.

Если вы передаете номер месяца в своем коде, я предлагаю вам вместо этого передать эти объекты перечисления. Это обеспечивает безопасность типов, допустимые значения и самодокументирующийся код.

Month month = localDate.getMonth();

При необходимости вы можете получить локализованное название этого месяца.

String output = month.getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH );  // Or Locale.US, Locale.ITALY, whatever.

Если вам действительно нужно число месяца от 1 до 12, спросите любым способом.

int monthNumber = month.getValue() ;
int monthNumber = localDate.getMonthValue() ;

О java.time

Платформа java.time встроен в Java 8 и более поздние версии. Эти классы заменяют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar и SimpleDateFormat.

Проект Joda-Time, теперь в режим обслуживания, советует перейти на java.time.

Чтобы узнать больше, см. учебник по Oracle. И поищите множество примеров и пояснений в Stack Overflow. Спецификация: JSR 310.

Где получить классы java.time?

Проект ThreeTen-Extra расширяет java.time дополнительными классами. . Этот проект является испытательным полигоном для возможных дополнений к java.time в будущем. Здесь вы можете найти несколько полезных классов, таких как Interval, YearWeek, YearQuarter и подробнее.

person Basil Bourque    schedule 20.03.2017