Question

Je suis en train de formater une date en Java de différentes manières en fonction des paramètres régionaux donné. Par exemple, je veux les utilisateurs anglais à voir "1 novembre 2009" (formaté par "d MMM, yyyy") et les utilisateurs norvégiens pour voir "1. novembre 2009" ( "d. MMM. Yyyy").

La partie de mois fonctionne bien si j'ajoute les paramètres régionaux au constructeur SimpleDateFormat, mais quid du reste?

J'espérais que je pourrais ajouter des chaînes de format jumelé avec des endroits à SimpleDateFormat, mais je ne peux trouver aucune façon de le faire. Est-il possible ou dois-je laisser mon chèque de code et les paramètres régionaux ajouter la chaîne de format correspondant?

Était-ce utile?

La solution

Utiliser DateFormat.getDateInstance (style int, locale locale) au lieu de créer vos propres modèles avec SimpleDateFormat.

Autres conseils

SimpleDateFormat dateFormat = new SimpleDateFormat("EEEE dd MMM yyyy", Locale.ENGLISH);
String formatted = dateFormat.format(the_date_you_want_here);

Utilisez le style + locale : DateFormat.getDateInstance (style int, locale Locale)

Vérifier http: //java.sun .com / J2SE / 1.5.0 / docs / api / java / text / DateFormat.html

Exécuter l'exemple suivant pour voir les différences:

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

public class DateFormatDemoSO {
  public static void main(String args[]) {
    int style = DateFormat.MEDIUM;
    //Also try with style = DateFormat.FULL and DateFormat.SHORT
    Date date = new Date();
    DateFormat df;
    df = DateFormat.getDateInstance(style, Locale.UK);
    System.out.println("United Kingdom: " + df.format(date));
    df = DateFormat.getDateInstance(style, Locale.US);
    System.out.println("USA: " + df.format(date));   
    df = DateFormat.getDateInstance(style, Locale.FRANCE);
    System.out.println("France: " + df.format(date));
    df = DateFormat.getDateInstance(style, Locale.ITALY);
    System.out.println("Italy: " + df.format(date));
    df = DateFormat.getDateInstance(style, Locale.JAPAN);
    System.out.println("Japan: " + df.format(date));
  }
}

Sortie:

United Kingdom: 25-Sep-2017
USA: Sep 25, 2017
France: 25 sept. 2017
Italy: 25-set-2017
Japan: 2017/09/25

tl; dr

LocalDate.now().format(
    DateTimeFormatter.ofLocalizedDate( FormatStyle.MEDIUM )
                     .withLocale( new Locale( "no" , "NO" ) )
)

Les classes gênants de java.util.Date et SimpleDateFormat sont maintenant héritage, supplanté par les classes java.time.

LocalDate

La classe LocalDate représente une date valeur -seulement sans temps de jour et sans fuseau horaire.

Une zone de temps est cruciale pour déterminer une date. Pour un moment donné, la date varie dans le monde entier par zone. Par exemple, quelques minutes après minuit dans Paris France est un nouveau jour tout en « hier » Montréal Québec .

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );

DateTimeFormatter

DateTimeFormatter pour générer des chaînes qui ne représentent que la date-partie ou la partie de temps.

Le DateTimeFormatter classe peut automatiquement localiser .

Pour localiser, préciser:

  • FormatStyle pour déterminer comment long ou la chaîne devrait être abrégée.
  • Locale pour déterminer (a) la langue humaine pour la traduction du nom du jour, le nom du mois, et tel, et (b) les normes culturelles de trancher des questions abréviation, la capitalisation, la ponctuation, et autres.

Exemple:

Locale l = Locale.CANADA_FRENCH ; 
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( FormatStyle.FULL ).withLocale( l );
String output = ld.format( f );

Dans l'autre direction, vous pouvez analyser une chaîne localisée.

LocalDate ld = LocalDate.parse( input , f );

Notez que les paramètres régionaux et le fuseau horaire sont des questions complètement orthogonales. Vous pouvez avoir un moment de Montréal présenté dans la langue japonaise ou un moment Nouvelle-Zélande Auckland présenté en langue hindi.

Un autre exemple: le changement 6 junio 2012 (espagnol) à 2012-06-06 (standard ISO 8601 format ). Les classes java.time utilisent des formats ISO 8601 par défaut pour parser / générer des chaînes.

String input = "6 junio 2012";
Locale l = new Locale ( "es" , "ES" );
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "d MMMM uuuu" , l );
LocalDate ld = LocalDate.parse ( input , f );
String output = ld.toString();  // 2012-06-06. 

Voici quelques exemples de code pour les résultats lisant attentivement des formats multiples dans plusieurs endroits, automatiquement localisés.

EnumSet est une implémentation de Set , hautement optimisé à la fois faible utilisation de la mémoire et la vitesse d'exécution rapide lors de la collecte des objets Enum . Ainsi, EnumSet.allOf( FormatStyle.class ) nous donne une collection de tous les quatre des objets FormatStyle enum à boucle. Pour plus d'informations, consultez Oracle Tutoriel sur les types enum .

LocalDate ld = LocalDate.of( 2018 , Month.JANUARY , 23 );

List < Locale > locales = new ArrayList <>( 3 );
locales.add( Locale.CANADA_FRENCH );
locales.add( new Locale( "no" , "NO" ) );
locales.add( Locale.US );

// Or use all locales (almost 800 of them, for about 120K text results).
// Locale[] locales = Locale.getAvailableLocales(); // All known locales. Almost 800 of them.

for ( Locale locale : locales )
{
    System.out.println( "------|  LOCALE: " + locale + " — " + locale.getDisplayName() + "  |----------------------------------" + System.lineSeparator() );

    for ( FormatStyle style : EnumSet.allOf( FormatStyle.class ) )
    {
        DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( style ).withLocale( locale );
        String output = ld.format( f );
        System.out.println( output );
    }
    System.out.println( "" );
}
System.out.println( "« fin »" + System.lineSeparator() );

Sortie.

------|  LOCALE: fr_CA — French (Canada)  |----------------------------------

mardi 23 janvier 2018
23 janvier 2018
23 janv. 2018
18-01-23

------|  LOCALE: no_NO — Norwegian (Norway)  |----------------------------------

tirsdag 23. januar 2018
23. januar 2018
23. jan. 2018
23.01.2018

------|  LOCALE: en_US — English (United States)  |----------------------------------

Tuesday, January 23, 2018
January 23, 2018
Jan 23, 2018
1/23/18

« fin »

A propos de java.time

Le java.time cadre est construit en Java 8 et versions ultérieures. Ces classes supplantent les classes date temps héritage gênant vieux href="https://en.wikipedia.org/wiki/Legacy_system" tels que java.util.Date , Calendar , et SimpleDateFormat .

Le Joda-Time projet , maintenant mode maintenance , conseille la migration vers la page java.time classes .

Pour en savoir plus, consultez le Oracle Tutorial . Et la recherche Stack Overflow pour de nombreux exemples et explications. Spécification est JSR 310 .

Vous pouvez échanger des java.time objets directement avec votre base de données. Utilisez un conforme JDBC 4.2 ou version ultérieure. Pas besoin de chaînes, pas besoin de classes java.sql.*.

Où obtenir les classes java.time?

Le projet ThreeTen-Extra java.time étend avec classes supplémentaires. Ce projet est un terrain d'essai pour les futurs ajouts possibles à java.time. Vous trouverez peut-être des classes utiles ici, comme Interval , YearWeek , YearQuarter et plus .

Localisation de chaîne de date:

D'après le poste de redsonic:

private String localizeDate(String inputdate, Locale locale) { 

    Date date = new Date();
    SimpleDateFormat dateFormatCN = new SimpleDateFormat("dd-MMM-yyyy", locale);       
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy");


    try {
        date = dateFormat.parse(inputdate);
    } catch (ParseException e) {
        log.warn("Input date was not correct. Can not localize it.");
        return inputdate;
    }
    return dateFormatCN.format(date);
}

String localizedDate = localizeDate("05-Sep-2013", new Locale("zh","CN"));

sera comme 05- 九月 -2013

affiche la date selon les paramètres régionaux de l'utilisateur courant :

Pour revenir date et l'heure:

import java.text.DateFormat;    
import java.util.Date;

Date date = new Date();
DateFormat df = DateFormat.getDateTimeInstance();
String myDate = df.format(date);

31 décembre 1969 19:00:02

Pour revenir ce jour seulement, utilisez:

DateFormat.getDateInstance() 

31 décembre 1969

String text = new SimpleDateFormat("E, MMM d, yyyy").format(date);

Java 8 Style pour une date donnée

LocalDate today = LocalDate.of(1982, Month.AUGUST, 31);
System.out.println(today.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).withLocale(Locale.ENGLISH)));
System.out.println(today.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).withLocale(Locale.FRENCH)));
System.out.println(today.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).withLocale(Locale.JAPANESE)));

Java8

 import java.time.format.DateTimeFormatter;         
 myDate.format(DateTimeFormatter.ofPattern("dd-MMM-YYYY",new Locale("ar")))
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top