Преобразование между названием месяца и номером месяца в Java

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

Например, мы получили название месяца «Янв» и нам нужно преобразовать его в номер месяца «1» или полное название месяца «Январь».

1. Преобразование номера месяца в название месяца

Когда мы получаем информацию о месяце в виде числа, предположим, 1, мы можем преобразовать ее в название месяца тремя способами:

  • «1 -> Январь»: Полное название месяца для целей отображения, как правило.
  • «1 -> ЯНВАРЬ»: Полное название месяца, хранящееся в перечислении java.time.Month.
  • «1 -> Янв»: это шаблон сокращения(краткой формы), в котором названия месяцев состоят из 3 символов.

Давайте рассмотрим программы Java для преобразования номеров месяцев в названия месяцев. Необходимо использовать информацию Locale для поддержки любых потребностей локализации приложения.

Каждый из этих методов использует метод Month.of(monthNumber) для получения экземпляра перечисления Month, соответствующего заданному номеру месяца. Затем вызываются методы getDisplayName() или name() с соответствующим TextStyle для получения желаемого представления месяца.

// 1 - Janpublic static String monthNumberToAbbr(int monthNumber) {return Month.of(monthNumber).getDisplayName(TextStyle.SHORT, Locale.getDefault());}// 1 - Januarypublic static String monthNumberToFullName(int monthNumber) {return Month.of(monthNumber).getDisplayName(TextStyle.FULL, Locale.getDefault());}// 1 - JANUARYpublic static String monthNumberToName(int monthNumber) {return Month.of(monthNumber).name();}

Давайте протестируем эти методы и проверим результаты:

System.out.println( monthNumberToAbbr(1) );System.out.println( monthNumberToFullName(1) );System.out.println( monthNumberToName(1) );

Вывод программы:

JanJanuaryJANUARY

В случае, если мы передаем недопустимое число(меньше 1 или больше 12), Month.of() выдает исключение DateTimeException.

2. Преобразование названия месяца в номер месяца

Чтобы преобразовать заданное название месяца в номер месяца, мы можем применить обратный подход, используя следующие шаблоны ввода:

  • Январь(полное название): Метод Month.valueOf() принимает название месяца в качестве параметра и возвращает перечисление Month, которое мы можем использовать несколькими способами.
  • Jan(сокращение): В перечислении Month нет прямой поддержки коротких названий, поэтому нам нужно придумать собственное решение. Мы создаем массив коротких названий для всех месяцев(удаляя до 3 символов), а затем находим входное сокращение в этом массиве с помощью API Stream.findFirst().
 public static int monthNameToNumber(String monthName) {return Month.valueOf(monthName.toUpperCase()).getValue();}public static int monthAbbrToNumber(String abbreviation) {Optional<Month> monthOptional = Arrays.stream(Month.values()).filter(month -> month.name().substring(0, 3).equalsIgnoreCase(abbreviation)).findFirst();return monthOptional.orElseThrow(IllegalArgumentException::new).getValue();}

Давайте протестируем эти методы и убедимся, что они преобразуют названия месяцев в числа, как и задумано.

System.out.println( monthNameToNumber("January") );System.out.println( monthAbbrToNumber("Jan") );

Вывод программы:

11

3. Преобразование сокращения месяца в полное имя

Несколько раз нам может потребоваться преобразовать заданное короткое название месяца в его полное название. Например, преобразовать Apr в April или преобразовать Jan в January. Следующий метод объединяет подходы в предыдущих разделах для достижения этого результата.

Метод предполагает, что аббревиатура, переданная в качестве аргумента, имеет длину в три символа и соответствует первым трем символам названия месяца(без учета регистра). Убедитесь, что введенная аббревиатура является допустимой аббревиатурой месяца, чтобы избежать исключений.

public static String monthAbbrToFullName(String abbreviation) {Optional<Month> monthOptional = Arrays.stream(Month.values()).filter(month -> month.name().substring(0, 3).equalsIgnoreCase(abbreviation)).findFirst();return monthOptional.orElseThrow(IllegalArgumentException::new).getDisplayName(TextStyle.FULL, Locale.getDefault());}

Мы можем проверить этот метод следующим образом:

System.out.println( monthAbbrToFullName("Jan") );

Вывод программы:

January

4. Заключение

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

Исходный код на Github

Прокрутить вверх