J'ai un morceau de code comme celui-ci de mon côté java:

private static DateFormat getHourFormatter(){

        //DateFormatSymbols dateFormatSymbols = new DateFormatSymbols(_locale);
        Locale locale = Locale.FRENCH; //locale : "fr"
        DateFormat hourFormatter = new SimpleDateFormat( "hh:mm a",locale); //hourFormatter: simpleDateFormat@103068 locale: "fr"
        hourFormatter.setTimeZone( TimeZone.getTimeZone("GMT") );
        return hourFormatter; //hourFormatter: SimpleDateFormat@103068
    }



protected static boolean isHoursTimeStringValid( String hourDisplay ) {
         try {
            getHourFormatter().parse( hourDisplay ); //hourDisplay: "01:01 Matin"
            return true;
         } catch (ParseException e) { //e: "java.text.ParseException: Upparseable date "01:01 Matin"
            return false; 
         }
    }

Cela fonctionne très bien pour les paramètres régionaux anglais si je change la valeur locale en US.

Mais pour la langue française, cela génère une erreur d'analyse.

java.text.ParseException: Date à remonter "01:01 Matin"

J'ai ajouté les informations de débogage en tant que ligne commentée pour une meilleure compréhension

0
SubhenduGN 24 nov. 2017 à 09:59

3 réponses

Meilleure réponse

Merci les gars pour toutes ces réponses.

Comme je l'ai mentionné précédemment, je ne peux pas me permettre de modifier la base de code.

Donc, ce que j'ai fait est:

public void setBeginAMPM( String ampm ) {
    if(ampm.equals(new I18NStringFactory().getString("Calendar", _locale , "default.time.am" ))) {
        _beginAMPM = "AM";
    }
    else if(ampm.equals(new I18NStringFactory().getString("Calendar", _locale , "default.time.pm" ))) {
        _beginAMPM = "PM";
    }
    else{
        _beginAMPM = ampm;
    }
}


public void setEndAMPM( String ampm ) {
    if(ampm.equals(new I18NStringFactory().getString("Calendar", _locale , "default.time.am" ))) {
        _endAMPM = "AM";
    }
    else if(ampm.equals(new I18NStringFactory().getString("Calendar", _locale , "default.time.pm" ))) {
        _endAMPM = "PM";
    }
    else{
        _endAMPM = ampm;
    }
}

Valeur _locale que je passe de la classe Action à la classe From. S'il est autre que l'anglais, il entrera dans l'un des blocs if ou dans le cas de l'anglais, il viendra dans le bloc else par défaut. En fonction de la valeur locale, il prend la valeur AM / PM du fichier de propriétés et la convertit en conséquence.

Je modifie simplement la valeur AM / PM d'autres langues spécifiques aux paramètres régionaux en anglais, car SimpleDateFormat () ne prend en charge que l'anglais.

Vous pouvez appeler cela un truc laid, mais devinez quoi, cela résout mon objectif.

0
SubhenduGN 28 nov. 2017 à 06:35

Si et seulement si vous n'avez que deux valeurs possibles (ici AM / PM), vous pouvez le faire avec SimpleDateFormat de cette façon:

DateFormatSymbols dfs = DateFormatSymbols.getInstance(Locale.FRENCH);
dfs.setAmPmStrings(new String[] { "Matin", "Soir" });
SimpleDateFormat input = new SimpleDateFormat("hh:mm a", Locale.FRENCH);
input.setTimeZone(java.util.TimeZone.getTimeZone("GMT"));
input.setDateFormatSymbols(dfs);

Date parsed = input.parse("01:01 Matin");

// control of parsing
SimpleDateFormat output = new SimpleDateFormat("HH:mm");
output.setTimeZone(java.util.TimeZone.getTimeZone("GMT"));
System.out.println(output.format(parsed)); // 01:01 (24-hour-clock)

J'ai ici réglé le fuseau horaire sur GMT afin d'éviter tout effet de zone. Vous pouvez vous en écarter si nécessaire (mais des précautions sont nécessaires).

Comme mentionné dans certains commentaires, je ne pense toujours pas que l'utilisation du champ AM / PM soit vraiment appropriée pour d'autres langues que l'anglais. Le français par exemple connaît au moins deux valeurs ou plus comme "nuit" (= nuit) ou "après-midi" (= après-midi). Mais cette façon n'est pas possible avec l'ancienne API ou le nouveau package java.time (nécessiterait des bibliothèques externes comme ICU4J ou Time4J).

1
Meno Hochschild 24 nov. 2017 à 10:30

Sans réécrire votre base de code existante, vous pouvez toujours introduire java.time, l'API de date et d'heure Java moderne, dans ce but particulier. Il offre une solution pour le français:

    Map<Long, String> amPmText = new HashMap<>(4);
    amPmText.put(0L, "Matin");
    amPmText.put(1L, "Soir");
    DateTimeFormatter timeFormatter = new DateTimeFormatterBuilder().appendPattern("hh:mm ")
            .appendText(ChronoField.AMPM_OF_DAY, amPmText)
            .toFormatter(Locale.FRENCH);

    System.out.println(LocalTime.parse("01:01 Matin", timeFormatter));
    System.out.println(LocalTime.parse("10:59 Soir", timeFormatter));

Cela imprime

01:01
22:59

Mixage java.time et les classes obsolètes

Jusqu'à présent, notre base de code (qui est ancienne) est un mélange amusant d'ancienne et de nouvelle utilisation de l'API de date et d'heure. Franchement, nous réécrivons rarement le code ancien et fonctionnel, mais nous utilisons toujours l'API moderne pour le nouveau code.

Je recommande vivement d'utiliser java.time partout où vous le pouvez. Il est généralement beaucoup plus agréable de travailler avec. Une fois que vous avez commencé à l'utiliser, je suis sûr que vous ne voudrez plus revenir en arrière.

Pour une solution pure SimpleDateFormat, consultez Commentaire de Meno Hochschild ci-dessous.

1
Ole V.V. 24 nov. 2017 à 10:06
47467863