Il y a une différence sur la façon dont Joda-Time et java.time
interprète le modèle e
.
En Joda temps, le motif e
designates the numeric value of day-of-week:
Symbol Meaning Presentation Examples
------ ----------- ------------ -------
e day of week number 2
Ainsi, en utilisant e
équivaut à obtenir le jour de la semaine à partir d'un objet Date:
// using org.joda.time.DateTime and org.joda.time.format.DateTimeFormat
DateTime d = new DateTime(2016, 12, 21, 20, 50, 25, 0, DateTimeZone.UTC);
DateTimeFormatter fmt = DateTimeFormat.forPattern("e").withLocale(Locale.ENGLISH);
System.out.println(d.toString(fmt)); // 3
System.out.println(d.getDayOfWeek()); // 3
System.out.println(d.dayOfWeek().getAsText(Locale.ENGLISH)); // Wednesday
Remarque que le formateur et getDayOfWeek()
renvoient 3
. Le getDayOfWeek()
method renvoie une valeur définie dans DateTimeConstants
class et Wednesday's value is 3
(the third day of the week selon ISO's definition).
Dans java.time
API, le motif e
has a different meaning:
Pattern Count Equivalent builder methods
------- ----- --------------------------
e 1 append special localized WeekFields element for numeric day-of-week
Il utilise l'élément WeekFields
localisé, et cela peut varier en fonction de l'environnement local. Le comportement peut être différent par rapport à la méthode getDayOfWeek()
:
ZonedDateTime z = ZonedDateTime.of(2016, 12, 21, 20, 50, 25, 0, ZoneOffset.UTC);
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("e", Locale.ENGLISH);
System.out.println(z.format(fmt)); // 4
System.out.println(z.getDayOfWeek()); // WEDNESDAY
System.out.println(z.getDayOfWeek().getValue()); // 3
Notez que le formatter utilise le jour localisé de la semaine pour les paramètres régionaux anglais, et la valeur est 4
, tout en appelant getDayOfWeek().getValue()
retours 3
.
C'est parce que e
avec paramètres régionaux anglais est équivalent à l'aide d'un java.time.temporal.WeekFields
:
// using localized fields
WeekFields wf = WeekFields.of(Locale.ENGLISH);
System.out.println(z.get(wf.dayOfWeek())); // 4
Alors que getDayOfWeek()
équivaut à utiliser la définition de l'ISO:
// same as getDayOfWeek()
System.out.println(z.get(WeekFields.ISO.dayOfWeek())); // 3
C'est parce que la définition de l'ISO utilise lundi le premier jour de la semaine, tandis que WeekFields
avec les paramètres régionaux anglais utilise le dimanche:
// comparing the first day of week
System.out.println(WeekFields.ISO.getFirstDayOfWeek()); // MONDAY
System.out.println(wf.getFirstDayOfWeek()); // SUNDAY
Ainsi, le modèle e
pourrait se comporter différemment ou non getDayOfWeek()
, selon les paramètres régionaux définis dans le formatter (ou la langue par défaut JVM, si aucune est définie). En environnement local français, par exemple, il se comporte comme ISO, alors que dans certains endroits arabes, le premier jour de la semaine est le samedi:
WeekFields.of(Locale.FRENCH).getFirstDayOfWeek(); // MONDAY
WeekFields.of(new Locale("ar", "AE")).getFirstDayOfWeek(); // SATURDAY
Selon javadoc, les seuls motifs qui renvoient une valeur numérique pour le jour de la semaine semblent être les localisés. Donc, pour analyser l'entrée 2016-12-21 20:50:25 Wednesday December +0000 3
, vous pouvez utiliser un java.time.format.DateTimeFormatterBuilder
et se joindre à la configuration date/heure avec un java.time.temporal.ChronoField
pour indiquer la valeur numérique du jour de la semaine (le champ sensible non-locale ISO):
String input = "2016-12-21 20:50:25 Wednesday December +0000 3";
DateTimeFormatter parser = new DateTimeFormatterBuilder()
// date/time pattern
.appendPattern("yyyy-MM-dd HH:mm:ss EEEE MMMM ZZ ")
// numeric day of week
.appendValue(ChronoField.DAY_OF_WEEK)
// create formatter with English locale
.toFormatter(Locale.ENGLISH);
ZonedDateTime date = ZonedDateTime.parse(input, parser);
Notez également que vous n'avez pas besoin de citer les caractères -
, :
et l'espace, afin que le motif devienne plus clair et lisible (IMO).
J'ai également défini les paramètres régionaux anglais, car si vous ne définissez pas, il utilisera les paramètres régionaux par défaut JVM et il n'est pas garanti d'être toujours anglais. Et il peut également être changé sans préavis, même au moment de l'exécution, il est donc préférable d'en spécifier un, surtout si vous savez déjà dans quelle langue l'entrée est.
Mise à jour: probablement le modèle ccccc
devrait fonctionner, car il est équivalent à appendText(ChronoField.DAY_OF_WEEK, TextStyle.NARROW_STANDALONE)
et dans mes tests (JDK 1.8.0_144), elle retourne (et parse) 3
:
DateTimeFormatter parser = DateTimeFormatter
.ofPattern("yyyy-MM-dd HH:mm:ss EEEE MMMM ZZ ccccc", Locale.ENGLISH);
ZonedDateTime date = ZonedDateTime.parse(input, parser);
Quel fuseau horaire/locale utilisez-vous, comme le dit le doc le jour de la semaine, certaines locales commencent la semaine du dimanche par opposition au lundi – hardillb
Pour clarifier j'ai ajouté le .withLocale (Locale.ENGLISH); dans le code. –