Formato de data Java - incluindo caracteres adicionais

87

Existe uma formatação de estilo php date () equivalente em Java? Quer dizer, em php eu posso usar a barra invertida para escapar de caracteres para que sejam tratados literalmente. Ou seja, yyyy \ y \ e \ a \ r se tornaria o ano de 2010 . Não encontrei nada semelhante em Java, todos os exemplos tratam apenas de formatos de data integrados.

Em particular, lido com selecionadores de data JCalendar e sua propriedade dateFormatString .

Eu preciso disso porque em minha localidade é necessário escrever todos os tipos de coisas adicionais em formato de data, como d. (para o dia) após a parte dos dias, m. (por anos) depois de anos parte e assim por diante. Na pior das hipóteses, eu poderia usar substituição de string ou regexp, mas talvez haja uma maneira mais simples? Desde já, obrigado!

Sejanus
fonte
1
Para quem está lendo isso em 2019 ou depois, a SimpleDateFormatclasse usada em algumas das respostas é notoriamente problemática e há muito desatualizada. Evite isso. Em vez disso, use a resposta curta de Mark Jeronimus, demonstrando o uso de java.time, a moderna API Java de data e hora .
Ole VV

Respostas:

164

Claro, com SimpleDateFormat você pode incluir strings literais:

Nas strings de padrão de data e hora, as letras não citadas de 'A' a 'Z' e de 'a' a 'z' são interpretadas como letras padrão que representam os componentes de uma string de data ou hora. O texto pode ser citado usando aspas simples (') para evitar interpretação. "''" representa uma aspa simples. Todos os outros caracteres não são interpretados; eles são simplesmente copiados para a string de saída durante a formatação ou comparados com a string de entrada durante a análise.

 "hh 'o''clock' a, zzzz"    12 o'clock PM, Pacific Daylight Time
Thilo
fonte
Super, isso é exatamente o que eu preciso. Surpreendentemente, não encontrei algo tão simples em nenhum dos vários exemplos que naveguei na web :) Muito obrigado!
Sejanus
1
Como faço para escapar do caractere de citação? Estou tentando fazer algo com o formato mm '. Indicando, por exemplo, 46 ​​minutos como 46 '.
Sotti
3
@Sotti: 46''. O primeiro a escapar do segundo.
Thilo
1
Para sua informação, as classes data-hora terrivelmente problemáticas como java.util.Date, java.util.Calendare java.text.SimpleDateFormatagora são legadas , suplantadas pelas classes java.time construídas no Java 8 e posterior.
Basil Bourque
24

Apenas para completar, o Java 8 DateTimeFormattertambém oferece suporte para:

DateTimeFormatter.ofPattern("yyyy 'year'");
Mark Jeronimus
fonte
6

Você pode usar String.format conforme documentado em java.util.Formatter :

Calendar c = ...;
String s = String.format("%tY year", c);
// -> s == "2010 year" or whatever the year actually is
R Samuel Klatchko
fonte
4

java.time

Mark Jeronimusdisse isso . Estou desenvolvendo um pouco mais. Basta colocar o texto a ser impresso literalmente entre aspas simples.

    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));

Resultado ao executar agora:

2010 year
2010 year
2019 year

Se você estiver usando a DateTimeFormatterBuildere seu appendPatternmétodo, use aspas simples da mesma maneira. Ou use seu appendLiteralmétodo, sem aspas simples.

Como colocamos aspas simples no formato, então? Duas aspas simples produzem uma. Não importa se as aspas simples duplas estão entre aspas simples ou não:

    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 horas da manhã, horário de verão do Pacífico

Todos os formatadores acima também podem ser usados ​​para análise. Por exemplo:

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

16:43:56

A SimpleDateFormatclasse usada quando essa pergunta foi feita há quase 10 anos é notoriamente problemática e há muito desatualizada. Eu recomendo que você use java.time, a API moderna de data e hora do Java. É por isso que demonstro exatamente isso.

Links

Ole VV
fonte
-4

java.text.SimpleDateFormat

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

Você obterá mais informações aqui texto do link

Javi
fonte