Format de date Java - y compris des caractères supplémentaires

87

Existe-t-il un équivalent au formatage de style php date () en Java? Je veux dire, en php, je peux échapper aux barres obliques inverses pour les traiter littéralement. Ie yyyy \ y \ e \ a \ r deviendrait 2010 année . Je n'ai rien trouvé de similaire en Java, tous les exemples ne concernent que les formats de date intégrés.

En particulier, je m'occupe des sélecteurs de dates JCalendar et de leur propriété dateFormatString .

J'en ai besoin parce que dans mes paramètres régionaux, il est nécessaire d'écrire toutes sortes de choses supplémentaires au format de date, comme d. (pour jour) après la partie des jours, m. (pendant des années) après des années et ainsi de suite. Dans le pire des cas, je pourrais utiliser un remplacement de chaîne ou une expression régulière, mais il existe peut-être un moyen plus simple? Merci d'avance!

Sejanus
la source
1
Pour tous ceux qui liront ceci en 2019 ou plus tard, la SimpleDateFormatclasse utilisée dans quelques réponses est notoirement gênante et dépassée depuis longtemps. L'éviter. Utilisez plutôt la réponse courte de Mark Jeronimus démontrant l'utilisation de java.time, l'API Java de date et d'heure moderne .
Ole VV

Réponses:

164

Bien sûr, avec SimpleDateFormat, vous pouvez inclure des chaînes littérales:

Dans les chaînes de modèle de date et d'heure, les lettres sans guillemets de «A» à «Z» et de «a» à «z» sont interprétées comme des lettres de modèle représentant les composants d'une chaîne de date ou d'heure. Le texte peut être cité en utilisant des guillemets simples (') pour éviter toute interprétation. "''" représente un guillemet simple. Tous les autres caractères ne sont pas interprétés; ils sont simplement copiés dans la chaîne de sortie lors du formatage ou mis en correspondance avec la chaîne d'entrée lors de l'analyse.

 "hh 'o''clock' a, zzzz"    12 o'clock PM, Pacific Daylight Time
Thilo
la source
Super, c'est exactement ce dont j'ai besoin. Étonnamment, je n'ai pas trouvé de chose aussi simple dans aucun des nombreux exemples que j'ai consultés sur le Web :) Merci beaucoup!
Sejanus
1
Comment échapper au caractère de citation? J'essaye de faire quelque chose avec le format mm '. Indiquant par exemple 46 minutes comme 46 '.
Sotti
3
@Sotti: 46''. Le premier à échapper au second.
Thilo
1
Pour info, les classes de date-heure terriblement gênantes telles que java.util.Date, java.util.Calendaret java.text.SimpleDateFormatsont maintenant héritées , supplantées par les classes java.time intégrées à Java 8 et versions ultérieures.
Basil Bourque
24

Juste pour être complet, Java 8 DateTimeFormatterprend également en charge ceci:

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

Vous pouvez utiliser String.format comme documenté dans java.util.Formatter :

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

java.time

Mark Jeronimus l'a déjà dit. Je l'étoffe un peu plus. Mettez simplement le texte à imprimer entre guillemets 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));

Sortie lors de l'exécution juste maintenant:

2010 year
2010 year
2019 year

Si vous utilisez a DateTimeFormatterBuilderet sa appendPatternméthode, utilisez les guillemets simples de la même manière. Ou utilisez appendLiteralplutôt sa méthode et pas de guillemets simples.

Comment mettre un guillemet simple dans le format, alors? Deux guillemets simples en produisent un. Peu importe que le guillemet simple double soit entre guillemets simples ou non:

    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 heures, heure avancée du Pacifique

Tous les formateurs ci-dessus peuvent également être utilisés pour l'analyse. Par exemple:

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

16:43:56

La SimpleDateFormatclasse utilisée lorsque cette question a été posée il y a près de 10 ans est notoirement gênante et dépassée depuis longtemps. Je vous recommande d'utiliser à la place java.time, l'API de date et d'heure Java moderne. C'est pourquoi je démontre exactement cela.

Liens

Ole VV
la source
-4

java.text.SimpleDateFormat

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

Vous obtiendrez plus d'informations ici lien texte

Javi
la source