Как получить месяц как целое число от заданной даты и вывести в формате названия месяца («МММ») - PullRequest
0 голосов
/ 16 сентября 2018

Я новичок в Java и не могу получить месяц, используя указанный ниже код. Вместо этого значение месяца установлено на 0. Пожалуйста, сообщите об ошибках, которые я здесь сделал.

*

for(int i=0;i<this.input.size();i++)
     {
         SimpleDateFormat sf = new SimpleDateFormat("dd/mm/yyyy");

         Date purchasedate;
        try {
            String details  = input.get(i);
            String[] detailsarr = details.split(",");
            purchasedate = sf.parse(detailsarr[1]);
            Calendar cal = Calendar.getInstance();
            cal.setTime(purchasedate);
            int month = cal.get(Calendar.MONTH);

* После получения указанного месяца в виде целого числа, не могли бы вы сообщить, есть ли возможность распечатать значение указанного месяца в формате "MMM"?

Ответы [ 3 ]

0 голосов
/ 16 сентября 2018

java.time

    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd/MM/uuuu");

    String dateStringFromInput = "29/08/2018";
    LocalDate purchasedate = LocalDate.parse(dateStringFromInput, dateFormatter);

    int monthNumber = purchasedate.getMonthValue();
    System.out.println("Month number is " + monthNumber);

Запуск приведенного выше фрагмента дает следующий вывод:

Номер месяца равен 8

Обратите внимание, что в отличие от Calendar LocalDate нумерует месяцы так же, как люди, август - это месяц 8. Однако для того, чтобы отформатировать месяц в стандартную трехбуквенную аббревиатуру, нам сначала не нужно число:

    Locale irish = Locale.forLanguageTag("ga");
    DateTimeFormatter monthFormatter = DateTimeFormatter.ofPattern("MMM", irish);

    String formattedMonth = purchasedate.format(monthFormatter);
    System.out.println("Formatted month: " + formattedMonth);

Форматированный месяц: Lún

Пожалуйста, укажите желаемый язык, в который я поместил ирландский / гэльский.Java знает сокращения месяца на огромном количестве языков.

Что пошло не так в вашем коде?

Кроме использования устаревших классов даты и времени, SimpleDateFormat, Date иCalendar, буквы шаблонов форматирования чувствительны к регистру (это верно и для современных DateTimeFormatter).Для разбора или форматирования месяца вам нужно использовать заглавные буквы M (что вы правильно сделали в заголовке).Нижний регистр m - для минуты часа.SimpleDateFormat здесь неприятно (как и слишком часто): вместо того, чтобы говорить вам, что что-то не так, за исключением, он просто по умолчанию подразумевает месяц по январь.Который Calendar, в свою очередь, возвращает вам месяц 0, поскольку он неестественно нумерует месяцы с 0 по 11.

Ссылки

0 голосов
/ 16 сентября 2018

Простой способ сделать это

Calendar cal = Calendar.getInstance();
Date d = cal.getTime();     
SimpleDateFormat sdf = new SimpleDateFormat("MMM");
System.out.println(sdf.format(d));

В вашем случае измените фрагмент, как показано ниже:

 SimpleDateFormat sf = new SimpleDateFormat("dd/mm/yyyy");
 Date purchasedate;
 try {
        String details  = input.get(i);
        String[] detailsarr = details.split(",");
        purchasedate = sf.parse(detailsarr[1]);
        SimpleDateFormat sdf = new SimpleDateFormat("MMM");
        String month = sdf.format(purchasedate);
   }
0 голосов
/ 16 сентября 2018

ТЛ; др

LocalDate.parse(          // Represent a date-only value, without time-of-day and without time zone.
    "23/01/2018" ,        // Tip: Use standard ISO 8601 formats rather than this localized format for data-exchange of date-time values.
    DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) 
)                         // Return a `LocalDate` object.
.getMonth()               // Return a `Month` enum object representing the month of this date.
.getDisplayName(          // Automatically localize, generating text of the name of this month.
    TextStyle.SHORT ,     // Specify (a) how long or abbreviated, and (b) specify whether used in stand-alone or combo context linguistically (irrelevant in English). 
    Locale.US             // Specify the human language and cultural norms to use in translation.
)                         // Returns a `String`.

См. Этот код в режиме реального времени на IdeOne.com .

Jan

java.time

Современный подход использует классы java.time , которые вытеснили ужасные Date / Calendar / SimpleDateFormat классы.

ISO 8601

Совет. При обмене значениями даты и времени в виде текста используйте стандартные форматы ISO 8601 , а не текст, предназначенный для представления людям. Для значения только для даты это будет ГГГГ-ММ-ДД, например 2018-01-23.

LocalDate

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

DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) ;
LocalDate ld = LocalDate.parse( "23/01/2018" , f ) ;

Month enum

Получить месяц как Month enum объект.

Month m = ld.getMonth() ;

Локализуйте

Попросите, чтобы Month enum генерировал String с текстом названия месяца. Метод getDisplayName может автоматически локализоваться для вас. Для локализации укажите:

  • TextStyle для определения длины или сокращения строки. Обратите внимание, что на некоторых языках вам может потребоваться выбрать автономный стиль в зависимости от контекста, в котором вы собираетесь использовать результат.
  • Locale для определения:
    • человеческий язык для перевода названия дня, названия месяца и т. П.
    • культурных норм , решающих вопросы аббревиатур, заглавных букв, пунктуации, разделителей и т. П.

Код:

String output = m.getDisplayName( TextStyle.SHORT , Locale.US ) ;

Использовать enum, а не integer

Обратите внимание, что мы не использовали целое число для представления месяца. Вместо этого использование объекта enum делает наш код более самодокументируемым, обеспечивает допустимые значения и обеспечивает type-safety .

Поэтому я настоятельно рекомендую передавать Month объекты, а не просто int целые числа. Но если вы настаиваете, позвоните Month.getMonthValue(), чтобы получить номер. Нумерация нормальная, 1-12 за январь-декабрь, в отличие от предыдущих классов.

int monthNumber = ld.getMonthValue() ;

О java.time

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

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

Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .

Вы можете обмениваться java.time объектами напрямую с вашей базой данных. Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии. Нет необходимости в строках, нет необходимости в java.sql.* классах.

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

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

...