Формат даты Java - включая дополнительные символы

88

Есть ли эквивалент форматирования стиля php date () в Java? Я имею в виду, что в php я могу использовать символы обратной косой черты, чтобы трактовать их буквально. Т.е. yyyy \ y \ e \ a \ r станет 2010 годом . Ничего подобного в Java я не нашел, все примеры касаются только встроенных форматов даты.

В частности, я имею дело с инструментами выбора даты JCalendar и их свойством dateFormatString .

Мне это нужно, потому что в моем регионе требуется писать всевозможные дополнительные вещи в формате даты, например d. (за сутки) после суток часть, м. (на годы) после разлуки лет и так далее. В худшем случае я мог бы использовать замену строки или регулярное выражение, но, может быть, есть более простой способ? Заранее спасибо!

Сеянус
источник
1
Для тех, кто читает это в 2019 году или позже, SimpleDateFormatкласс, использованный в нескольких ответах, заведомо проблематичен и давно устарел. Избегай это. Вместо этого используйте короткий ответ Марка Джеронимуса, демонстрирующий использование java.time, современного API даты и времени Java .
Ole VV

Ответы:

164

Конечно, с SimpleDateFormat вы можете включать буквальные строки:

В строках шаблонов даты и времени буквы без кавычек от «A» до «Z» и от «a» до «z» интерпретируются как буквы шаблона, представляющие компоненты строки даты или времени. Текст можно заключить в одинарные кавычки ('), чтобы избежать интерпретации. «''» представляет собой одинарную кавычку. Все остальные символы не интерпретируются; они просто копируются в выходную строку во время форматирования или сопоставляются с входной строкой во время синтаксического анализа.

 "hh 'o''clock' a, zzzz"    12 o'clock PM, Pacific Daylight Time
Тило
источник
Супер, это именно то, что мне нужно. Удивительно, но я не нашел такой простой вещи ни в одном из многочисленных примеров, которые просматривал в сети :) Большое спасибо!
Sejanus
1
Как избежать символа кавычки? Пытаюсь что-то сделать с форматом мм '. Например, 46 минут, например 46 минут.
Сотти,
3
@Sotti: 46''. Первый спасается вторым.
Тило
1
К вашему сведению, ужасно неприятные классы даты и времени, такие как java.util.Date, java.util.Calendarи java.text.SimpleDateFormat, теперь унаследованы , вытеснены классами java.time, встроенными в Java 8 и более поздних версий .
Basil
24

Для полноты картины Java 8 DateTimeFormatterтакже поддерживает это:

DateTimeFormatter.ofPattern("yyyy 'year'");
Марк Иеронимус
источник
6

Вы можете использовать String.format, как описано в java.util.Formatter :

Calendar c = ...;
String s = String.format("%tY year", c);
// -> s == "2010 year" or whatever the year actually is
R Сэмюэл Клатчко
источник
5

java.time

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

    DateTimeFormatter yearFormatter = DateTimeFormatter.ofPattern("yyyy 'year'");
    System.out.println(LocalDate.of(2010, Month.FEBRUARY, 3).format(yearFormatter));
    System.out.println(Year.of(2010).format(yearFormatter));
    System.out.println(ZonedDateTime.now(ZoneId.of("Europe/Vilnius")).format(yearFormatter));

Вывод при запуске только что:

2010 year
2010 year
2019 year

Если вы используете a DateTimeFormatterBuilderи его appendPatternметод, используйте одинарные кавычки таким же образом. Или используйте его appendLiteralметод и без одинарных кавычек.

Как же нам поместить в формат одинарную кавычку? Две одинарные кавычки дают одну. Не имеет значения, находится ли двойная одинарная кавычка внутри одинарных кавычек или нет:

    DateTimeFormatter formatterWithSingleQuote = DateTimeFormatter.ofPattern("H mm'' ss\"");
    System.out.println(LocalTime.now(ZoneId.of("Europe/London")).format(formatterWithSingleQuote));

10 28 '34 "

    DateTimeFormatter formatterWithSingleQuoteInsideSingleQuotes
            = DateTimeFormatter.ofPattern("hh 'o''clock' a, zzzz", Locale.ENGLISH);
    System.out.println(ZonedDateTime.now(ZoneId.of("America/Los_Angeles"))
            .format(formatterWithSingleQuoteInsideSingleQuotes));

02:00 по тихоокеанскому летнему времени

Все вышеперечисленные средства форматирования также можно использовать для синтаксического анализа. Например:

    LocalTime time = LocalTime.parse("16 43' 56\"", formatterWithSingleQuote);
    System.out.println(time);

16:43:56

SimpleDateFormatКласс , используемый , когда этот вопрос был задан почти 10 лет назад , как известно , хлопотное и долгое время устарели. Я рекомендую вместо этого использовать java.time, современный API даты и времени Java. Вот почему я демонстрирую именно это.

Ссылки

Оле В.В.
источник
-4

java.text.SimpleDateFormat

SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd"); 
String formattedDate = formatter.format(date);

Вы получите больше информации здесь текст ссылки

Хави
источник