Формат даты в формате Java - включая дополнительные символы
Есть ли эквивалент форматирования стиля php date() в Java? Я имею в виду, что в php я могу использовать символы обратного слэша, чтобы они обрабатывались буквально. То есть yyyy\y\e\a\r станет 2010 год. Я не нашел ничего подобного на Java, все примеры имеют дело только со встроенными форматами дат.
В частности, я рассматриваю JCalendar сборщиков дат и их свойство dateFormatString.
Мне это нужно, потому что в моей локали требуется писать всевозможные дополнительные данные в формате даты, например, d. (за день) после дня части, м. (в течение многих лет) после нескольких лет и так далее. В худшем случае я мог бы использовать строку replace или regexp, но, может быть, есть более простой способ? Спасибо заранее!
Ответы
Ответ 1
Конечно, с SimpleDateFormat вы можете включить литералы:
В строках паттернов даты и времени неквалифицированные буквы от 'A' до 'Z' и от 'a' до 'z' интерпретируются как буквы шаблонов, представляющие компоненты даты или строки времени. Текст можно указывать с использованием одинарных кавычек ('), чтобы избежать интерпретации. "" представляет одну цитату. Все остальные символы не интерпретируются; они просто копируются в строку вывода во время форматирования или сопоставляются с входной строкой во время разбора.
"hh 'o''clock' a, zzzz" 12 o'clock PM, Pacific Daylight Time
Ответ 2
Просто для полноты, Java 8 DateTimeFormatter
также поддерживает это:
DateTimeFormatter.ofPattern("yyyy 'year'");
Ответ 3
Вы можете использовать String.format, как описано в java.util.Formatter:
Calendar c = ...;
String s = String.format("%tY year", c);
// -> s == "2010 year" or whatever the year actually is
Ответ 4
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
Если вы используете 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, современный Java-интерфейс даты и времени. Вот почему я демонстрирую именно это.
Ссылки
Ответ 5
java.text.SimpleDateFormat
SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd");
String formattedDate = formatter.format(date);
Вы получите дополнительную информацию здесь текст ссылки