SimpleDateFormat.format () не возвращает правильную форматированную строку даты - PullRequest
0 голосов
/ 10 июня 2019

Я пытаюсь отформатировать дату в формате «МММММ гг». Однако когда я запускаю код, он не возвращает полностью отформатированную дату.

Вот код

Date date = Calendar.getInstance().getTime(); // "Mon Jun 10 09:50:06 HST 2019"
SimpleDateFormat format = new SimpleDateFormat("MMMMM yy", Locale.US);
String formatDate = format.format(date); // "J 19"
System.out.println(formatDate);

Скажем, введенная дата - "Mon Jun 10 09:50:06 HST 2019", а результирующий вывод - "J 19", когда я хочу, чтобы она была "June 19". Я чувствую, что упускаю что-то простое здесь, но не могу понять, что.

Ответы [ 4 ]

3 голосов
/ 10 июня 2019

MMMMM соответствует формату «крошечного» месяца.Используйте четырехбуквенный формат MMMM для полного названия месяца.

Ссылки:

https://developer.android.com/reference/android/icu/text/SimpleDateFormat

http://androidxref.com/9.0.0_r3/xref/libcore/ojluni/src/main/java/java/text/SimpleDateFormat.java#1426

0 голосов
/ 12 июня 2019

java.time и ThreeTenABP

    DateTimeFormatter monthFormatter = DateTimeFormatter.ofPattern("MMMM uu", Locale.US);
    YearMonth thisMonth = YearMonth.now(ZoneId.of("America/Louisville"));
    String formatDate = thisMonth.format(monthFormatter);
    System.out.println(formatDate);

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

19 июня

Я использую и рекомендую java.time, современный Java-интерфейс даты и времени. Используемые вами классы даты и времени Calendar, в частности SimpleDateFormat, всегда плохо спроектированы и давно устарели.

Вопрос: Могу ли я использовать java.time на Android?

Да, java.time прекрасно работает на старых и новых устройствах Android. Для этого требуется как минимум Java 6 .

  • В Java 8 и более поздних версиях и на более новых устройствах Android (начиная с уровня API 26) встроен современный API.
  • В Java 6 и 7 получите ThreeTen Backport, бэкпорт современных классов (ThreeTen для JSR 310; см. Ссылки внизу).
  • На более старых версиях Android используется Android-версия ThreeTen Backport. Это называется ThreeTenABP. И убедитесь, что вы импортируете классы даты и времени из org.threeten.bp с подпакетами.

Ссылки

0 голосов
/ 10 июня 2019

С Документация Android для SimpleDateFormat :

Автономный месяц - используйте один или два для числового месяца, три для сокращение, четыре для полного (широкого) имени или 5 для узкого название. С двумя ("LL") номер месяца, если необходимо, дополняется нулями (например, "08").

Код должен быть:

Date date = Calendar.getInstance().getTime();
SimpleDateFormat format = new SimpleDateFormat("MMMM yy", Locale.US);
String formatDate = format.format(date); 
System.out.println(formatDate);

Выход:

June 19
0 голосов
/ 10 июня 2019

Я попробовал ваш код, и он работает как положено.Я получил 19 июня в результате.Как уже прокомментировал Андреас, вы можете удалить одну букву M в SimpleDateFormat, потому что буквы шаблонов длиной более 3 будут в полной форме.

Месяц: если количество букв шаблонов равно 3 или более,месяц интерпретируется как текст;в противном случае он интерпретируется как число.

Текст: для форматирования, если число букв шаблона составляет 4 или более, используется полная форма;в противном случае используется короткая или сокращенная форма, если таковая имеется.Для синтаксического анализа принимаются обе формы независимо от количества букв шаблона.

, поэтому ваш шаблон SimpleDateFormat будет иметь вид:

new SimpleDateFormat("MMMM yy", Locale.US);
...