Formato della data Java, inclusi caratteri aggiuntivi


88

Esiste un equivalente alla formattazione in stile php date () in Java? Voglio dire, in php posso fare caratteri di escape con barra rovesciata per farli trattare letteralmente. Cioè yyyy \ y \ e \ a \ r diventerebbe l' anno 2010 . Non ho trovato nulla di simile in Java, tutti gli esempi riguardano solo i formati di data incorporati.

In particolare, mi occupo dei selettori di date JCalendar e della loro proprietà dateFormatString .

Ne ho bisogno perché nel mio locale è necessario scrivere ogni sorta di materiale aggiuntivo in formato data, come d. (per giorno) dopo giorni parte, m. (per anni) dopo anni parte e così via. Nel peggiore dei casi potrei usare string replace o regexp ma forse c'è un modo più semplice? Grazie in anticipo!


1
Per chiunque legga questo nel 2019 o più tardi, la SimpleDateFormatclasse usata in un paio di risposte è notoriamente fastidiosa e obsoleta da tempo. Evitalo. Usa invece la risposta breve di Mark Jeronimus che dimostra l'uso di java.time, la moderna API di data e ora di Java .
Ole VV

Risposte:


165

Certo, con SimpleDateFormat puoi includere stringhe letterali:

All'interno di stringhe di modelli di data e ora, le lettere non quotate da "A" a "Z" e da "a" a "z" vengono interpretate come lettere di modello che rappresentano i componenti di una stringa di data o ora. Il testo può essere citato utilizzando virgolette singole (') per evitare l'interpretazione. "''" rappresenta una virgoletta singola. Tutti gli altri caratteri non vengono interpretati; vengono semplicemente copiati nella stringa di output durante la formattazione o confrontati con la stringa di input durante l'analisi.

 "hh 'o''clock' a, zzzz"    12 o'clock PM, Pacific Daylight Time

Super, questo è esattamente ciò di cui ho bisogno. Sorprendentemente non ho trovato una cosa così semplice in nessuno dei numerosi esempi che ho sfogliato nel web :) Grazie mille!
Seiano

1
Come faccio a sfuggire al carattere di citazione? Sto cercando di fare qualcosa con il formato mm '. Indica ad esempio 46 minuti come 46 '.
Sotti

3
@Sotti: 46''. Il primo a sfuggire al secondo.
Thilo

1
Cordiali saluti, le classi data-ora terribilmente problematiche come java.util.Date, java.util.Calendare java.text.SimpleDateFormatsono ora legacy , soppiantate dalle classi java.time incorporate in Java 8 e versioni successive.
Basil Bourque

24

Solo per completezza, Java 8 DateTimeFormattersupporta anche questo:

DateTimeFormatter.ofPattern("yyyy 'year'");


6

java.time

Mark Jeronimus l'ha già detto . Lo sto rimpolpando un po 'di più. Basta inserire il testo da stampare letteralmente tra virgolette singole.

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

Output durante l'esecuzione solo ora:

2010 year
2010 year
2019 year

Se stai usando a DateTimeFormatterBuildere il suo appendPatternmetodo, usa le virgolette singole allo stesso modo. Oppure usa il suo appendLiteralmetodo e non le virgolette singole.

Come inseriamo una singola citazione nel formato, allora? Due virgolette singole ne producono uno. Non importa se le virgolette doppie singole si trovano all'interno di virgolette singole o meno:

    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 AM, Pacific Daylight Time

Tutti i formattatori sopra possono essere usati anche per l'analisi. Per esempio:

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

16:43:56

Il SimpleDateFormat classe usata quando questa domanda è stata posta quasi 10 anni fa è notoriamente problematica e da tempo obsoleta. Ti consiglio invece di utilizzare java.time, la moderna API di data e ora di Java. Ed è per questo che dimostro proprio questo.

Collegamenti


-4

java.text.SimpleDateFormat

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

Otterrai maggiori informazioni qui il testo del link

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.