Java.lang.IllegalArgumentException: caractère de motif illégal "Y" pour SimpleDateFormat
Le code suivant:
Calendar now = Calendar.getInstance();
month = now.get(Calendar.MONTH) + 1;
year = now.get(Calendar.YEAR);
System.out.println("Month " + month + " year " + year);
SimpleDateFormat dt1 = new SimpleDateFormat("MMMM YYYY");
e.setMonthnYear(dt1.format(now.getTime()));
Après le déploiement sur le serveur est de montrer exception suivante:
java.lang.IllegalArgumentException: Illegal pattern character 'Y'
java.text.SimpleDateFormat.compile(SimpleDateFormat.java:768)
java.text.SimpleDateFormat.initialize(SimpleDateFormat.java:575)
java.text.SimpleDateFormat.<init>(SimpleDateFormat.java:500)
java.text.SimpleDateFormat.<init>(SimpleDateFormat.java:475)
iland.employee.EmployeeAction.fetchAllAtted(EmployeeAction.java:169)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
sur mon hôte local j'utilise JDK v1.8
et le code ci-dessus fonctionne parfaitement, mais sur le serveur il ne fonctionne pas.
comment résoudre ce problème?
6 réponses
SimpleDateFormat dt1 = new SimpleDateFormat("MMMM yyyy");
sur votre Local vous utilisez peut-être Java 8, alors vérifiez la version de Java sur votre serveur. Si elle est inférieure à Java 7 de la capitale Y
ne fonctionne pas.
référez-vous à Java 6 Oracle Docs pour SimpleDateFormat
Vous devez écrire Y
pour l'année en petites et non en capitales.
Comme pour les 2 chiffres de l'année:
SimpleDateFormat dt1 = new SimpleDateFormat("yy");
et pour l'année à 4 chiffres:
SimpleDateFormat dt1 = new SimpleDateFormat("yyyy");
dans le cas où vous utilisez Java 7 ou plus haut:
Vous pouvez utiliser l' capital Y
représente Week Year
.
reportez-vous à Oracle Java 7 Docs SimpleDateFormat
selon le javadoc
If week year 'Y' is specified and the calendar doesn't support any week years,
the calendar year ('y') is used instead. The support of week years can be tested
with a call to getCalendar().isWeekDateSupported().
donc le seul problème est guess est votre version de java < 1.7 parce que JRE1.7 a ajouté le modèle " Y " pour la semaine de l'année et en JRE1.6 il n'y a pas de modèle pour cela.
Ou tout simplement rester sur le côté plus sûr d'utiliser y
au lieu de Y
.
une chose de plus essayez toujours d'utiliser locale pour être du côté plus sûr
SimpleDateFormat dt1 = new SimpleDateFormat("MMMM yyyy",java.util.Locale.ENGLISH);
Android
documentation diffère de la mise en œuvre. Les caractères pris en charge sont définis à une constante de chaîne SimpleDateFormat
jusqu'au niveau API 23. À partir de la code source:
static final String PATTERN_CHARS = "GyMdkHmsSEDFwWahKzZLc";
Depuis le " Y " (Semaine de l'Année) n'est pas inclus, le modèle de validation déclenche l'exception:
java.lang.IllegalArgumentException: Unknown pattern character 'Y'
une solution rapide, lorsque le comportement de l'année de la semaine n'est pas requis, est d'utiliser le "y", par exemple: yyyy-MM-dd
.
' Y ' comme motif le caractère est supporté à partir du niveau 24 de L'API.
mise à Jour
documentation liste maintenant les niveaux D'API supportés pour les caractères de pattern.
j'ai pris cette table de java docs.
Letter Date or Time Component Presentation Examples
G Era designator Text AD
y Year Year 1996; 96
M Month in year Month July; Jul; 07
w Week in year Number 27
W Week in month Number 2
D Day in year Number 189
d Day in month Number 10
F Day of week in month Number 2
E Day in week Text Tuesday; Tue
Dans votre cas, il suffit de remplacer"Y" pour "y" vous pouvez voir Docs ici
Letter Date or Time Component Presentation Examples
y Year Year 1996; 96
Y Week year Year 2009; 09
demander Week year
au lieu de year
dans votre SimpleDateFormat()