Я знаю , что это даст мне день месяца как число ( 11
, 21
, 23
):
SimpleDateFormat formatDayOfMonth = new SimpleDateFormat("d");
Но как вы форматируете день месяца, чтобы включить порядковый индикатор , скажем 11th
, 21st
или 23rd
?
java
date
simpledateformat
ordinal
Кен Хьюм
источник
источник
SimpleDateFormat
занятий. Он не только давно устарел, но и печально известен своими хлопотами. Сегодня у нас намного лучше вjava.time
современном API даты и времени Java и егоDateTimeFormatter
.Ответы:
Таблица из @kaliatech хороша, но поскольку та же информация повторяется, это открывает шанс для ошибки. Такая ошибка фактически существует в таблице для
7tn
,17tn
и27tn
(эта ошибка может быть исправлена с течением времени из-за изменчивой природы StackOverflow, поэтому проверьте историю версий в ответе, чтобы увидеть ошибку).источник
В JDK нет ничего, чтобы сделать это.
Или используя календарь:
Согласно комментариям @ thorbjørn-ravn-andersen, такая таблица может быть полезна при локализации:
источник
источник
java.lang.IllegalArgumentException
из-за "недопустимого образца характера, т."Вопрос немного староват. Поскольку этот вопрос очень шумный, публикуем то, что я решил, используя статический метод в качестве утилиты. Просто скопируйте, вставьте и используйте его!
Для тестирования мочеиспускания
Пример: вызов его из основного метода!
Вывод:
источник
источник
Я хотел бы внести современный ответ.
SimpleDateFormat
Класс был нормально использовать , когда вопрос был задан 8 лет назад, но вы должны избегать его сейчас , как это не только давно устарели, но и как известно , хлопотное. Используйтеjava.time
вместо этого.редактировать
DateTimeFormatterBuilder.appendText(TemporalField, Map<Long, String>)
отлично подходит для этой цели. Используя его, мы создаем форматтер, который делает работу за нас:Выход из этого фрагмента:
Старый ответ
Этот код короче, но ИМХО не так элегантно.
Запустив этот фрагмент только сейчас, я получил
Одна из многих особенностей
java.time
заключается в том, что получить день месяца в виде простого и надежногоint
, очевидно, необходимо для выбора правильного суффикса из таблицы.Я рекомендую вам написать модульный тест тоже.
PS Подобный форматер также можно использовать для анализа строки даты, содержащей порядковые номера, например
1st
,2nd
и т. Д. Это было сделано в этом вопросе: Java - анализ даты с дополнительными секундами .Ссылка: Oracle, учебник: Дата и время, объясняющие, как использовать
java.time
.источник
Если вы попытаетесь узнать о i18n, решение станет еще сложнее.
Проблема в том, что в других языках суффикс может зависеть не только от самого числа, но и от существительного, которое он считает. Например, на русском языке это будет «2-ой день», но «2-ая неделя» (это означает «2-й день», но «2-я неделя»). Это не применимо, если мы форматируем только дни, но в более общем случае вы должны знать о сложности.
Я думаю, что хорошим решением (у меня не было времени на самом деле реализовать) было бы расширить SimpleDateFormetter, чтобы применять Locale-осознавший MessageFormat перед передачей в родительский класс. Таким образом, вы сможете поддерживать, скажем, для мартовских форматов% M для получения «3-го»,% MM для «03-го» и% MMM для «третьего». Со стороны этот класс выглядит как обычный SimpleDateFormatter, но поддерживает больше форматов. Также, если этот шаблон будет по ошибке применен обычным SimpleDateFormetter, результат будет неправильно отформатирован, но все еще читаем.
источник
Многие из приведенных здесь примеров не будут работать для 11, 12, 13. Это более общее и будет работать для всех случаев.
источник
Я не могу быть удовлетворен ответами, призывающими к решению только на английском языке на основе ручных форматов. Я давно искал подходящее решение и наконец нашел его.
Вы должны использовать RuleBasedNumberFormat . Это работает отлично, и это с уважением к Locale.
источник
Существует более простой и надежный способ сделать это. Вам нужно использовать функцию getDateFromDateString (dateString); Он в основном удаляет st / nd / rd / th из строки даты и просто анализирует ее. Вы можете изменить свой SimpleDateFormat на что угодно, и это будет работать.
}
источник
Единственная проблема с решением, предоставленным Грегом, состоит в том, что он не учитывает число больше 100 с окончанием «подростковых» чисел. Например, 111 должен быть 111-м, а не 111-м. Это мое решение:
источник
th
на 11, 12 и 13, как и должно быть. Я верю, чтоif ( hunRem - tenRem == 10 )
дело подтверждает это.RuleBasedNumberFormat
в библиотеке ICUЯ высоко оценил ссылку на библиотеку проекта ICU от @ Pierre-Olivier Dybman ( http://www.icu-project.org/apiref/icu4j/com/ibm/icu/text/RuleBasedNumberFormat.html ), однако все еще должен был понять как его использовать, поэтому пример
RuleBasedNumberFormat
использования приведен ниже.Он будет форматировать только одно число, а не всю дату, поэтому вам нужно будет создать комбинированную строку, если вы ищете дату в формате: понедельник, 3 февраля, например.
Приведенный ниже код устанавливает
RuleBasedNumberFormat
формат Ordinal для данного Locale, создаетjava.time ZonedDateTime
, а затем форматирует число с порядковым номером в строку.Пример вывода:
Или
и т.п.
источник
Вот подход, который обновляет шаблон DateTimeFormatter с правильным литеральным суффиксом, если он находит шаблон
d'00'
, например, для дня месяца 1 он будет заменен наd'st'
. После того, как шаблон был обновлен, он может быть передан в DateTimeFormatter, чтобы сделать все остальное.Требуется, чтобы исходный шаблон обновлялся непосредственно перед каждым вызовом форматирования, например
Так что это полезно, если шаблон форматирования определен вне Java-кода, например, шаблона, где, как если бы вы могли определить шаблон в Java, тогда ответ @ OleV.V. может быть более подходящим
источник
Я написал себе вспомогательный метод, чтобы получить шаблоны для этого.
и тогда мы можем назвать это как
выход
источник
Попробуйте функцию ниже:
источник
Date
,Calendar
аSimpleDateFormat
. Эти классы плохо спроектированы и давно устарели, последние особенно печально известны. Вместо этого используйтеLocalDate
иDateTimeFormatter
, как из java.time, современный Java-интерфейс даты и времени . Также я сомневаюсь, что нового дает ваш ответ по сравнению с другими 18 ответами?В kotlin вы можете использовать как это
установить так
источник
Следующий метод может использоваться для получения отформатированной строки даты, которая передана ей. Он отформатирует дату, скажем 1-й, 2-й, 3-й, 4-й .. используя SimpleDateFormat в Java. например: - 1 сентября 2015
источник
Ниже приведен более эффективный ответ на вопрос, чем жесткое программирование стиля.
Чтобы изменить день на порядковый номер, вам нужно использовать следующий суффикс .
Найдите мой законченный ответ в этом вопросе.
источник
источник