J'ai un code et un test dans un héritage de l'application, qui peuvent être résumées comme suit:
@Test
public void testParseDate() throws ParseException {
String toParse = "Mo Aug 18 11:25:26 MESZ +0200 2014";
String pattern = "EEE MMM dd HH:mm:ss z Z yyyy";
DateFormat dateFormatter = new SimpleDateFormat(pattern, Locale.GERMANY);
Date date = dateFormatter.parse(toParse);
//skipped assumptions
}
Ce test passe dans Java 8 et ci-dessous. Cependant, avec Java 10 vers le haut, ce qui conduit à un java.text.ParseException: Unparseable date: "Mo Aug 18 11:25:26 MESZ +0200 2014"
.
Pour l'enregistrement:
En plus d' de_DE
, l'exception est également lancée pour les paramètres régionaux
de_CH
, de_AT
, de_LU
.
Je suis conscient du fait, que le formatage de la Date a été changé avec le JDK 9 (JEP 252). Cependant, je considère que cela est un changement radical de casser la compatibilité ascendante. Extrait:
Dans le JDK 9, le Consortium Unicode Commune de paramètres Régionaux Référentiel de Données (CLDR) de données est activé dans les paramètres régionaux par défaut de données, de sorte que vous pouvez utiliser les paramètres régionaux des données sans aucune autre action.
Dans le JDK 8, bien que la CLDR de données locale est livré avec le JRE, il n'est pas activé par défaut.
Le Code qui utilise les paramètres régionaux des services tels que la date, l'heure et le numéro de mise en forme peuvent produire des résultats différents avec la CLDR de données locale.
L'ajout d'un .
pour le jour de la semaine (Mo.
) compense ce et test de passage. Cependant, ce n'est pas une vraie solution pour les vieux de données (en forme sérialisée tels que XML).
La vérification de cette stackoverflow post, il semble que le comportement est intentionnel pour la version allemande, et peuvent être atténués par la spécification java.locale.providers
avec COMPAT
mode. Cependant, je n'aime pas l'idée de s'appuyer sur un système de valeur de la propriété pour deux raisons qu'il peut:
- changer dans les prochaines versions du JDK.
- être oublié dans différents environnements.
Ma question est:
- Comment puis-je maintenir la compatibilité ascendante de code hérité avec ce modèle de date, sans ré-écriture / modification de données sérialisées ou l'ajout / modification des propriétés du système (comme
java.locale.providers
), ce qui peut être oublié dans différents environnements (serveurs d'applications, autonome, pots, ...) ?