web-dev-qa-db-fra.com

Modèle Joda DateTime ISODateTimeFormat

Les documents Joda ISODateTimeFormat disent ISODateTimeFormat.dateTime() renvoie un formateur pour le motif yyyy-MM-dd'T'HH: mm: ss.SSSZZ

Mais le formateur renvoie un "Z" au lieu de +00: 00
regarde ça-

DateTime dt = DateTime.now(DateTimeZone.UTC);

DateTimeFormatter patternFormat = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZZ");
DateTimeFormatter isoFormat = ISODateTimeFormat.dateTime();

System.out.println(dt.toString(patternFormat));     //2014-06-01T03:02:13.552+00:00
System.out.println(dt.toString(isoFormat));         //2014-06-01T03:02:13.552Z

Quelqu'un peut-il me dire quel serait le motif pour que le +00: 00 s'imprime en Z

Edit: Juste pour clarifier - je sais que le 'Z' est le même que +00: 00 mais textuellement c'est différent. Ce que je demande, c'est quel modèle placerait un Z comme décalage temporel au lieu de +00: 00

(Désolé si c'est trop trivial. Je voulais utiliser le format ISO sans millisecondes et au cours de l'écriture de cette question, j'ai trouvé exactement ce que je cherchais dans ISODateTimeFormat.dateTimeNoMillis() donc je demande maintenant seulement par intérêt)

19
Dave Pile

Il ne semble pas que vous puissiez construire un tel formateur uniquement à partir d'un modèle. Le document DateTimeFormat dit:

Zone:

  • 'Z' sort décalé sans deux points,
  • 'ZZ' sort le décalage avec deux points,
  • 'ZZZ' ou plus affiche l'ID de zone.

Vous pouvez créer la plupart du formateur à partir d'un modèle, puis personnaliser la sortie du fuseau horaire comme ceci:

    DateTimeFormatter patternFormat = new DateTimeFormatterBuilder()
        .appendPattern("yyyy-MM-dd'T'HH:mm:ss.SSS")
        .appendTimeZoneOffset("Z", true, 2, 4)
        .toFormatter();
13
araqnid
But the formatter returns a "Z" in place of +00:00 see this-

Voir doc à nouveau, il a dit clairement,

The time zone offset is 'Z' for zero, and of the form '±HH:mm' for non-zero.

Donc, cette valeur ISO 2014-06-01T03: 02: 13.552Z est équivalente à 2014-06-01T03: 02: 13.552 + 00: .

Dans votre code pour voir la casse non nulle, essayez avec

DateTime dt = DateTime.now(); //without arg DateTimeZone.UTC;
3
Wundwin Born

Si vous savez que votre TimeZone sera toujours DateTimeZone.UTC, vous pouvez alors injecter le Z dans le motif comme le caractère T a été injecté. Quelque chose comme ça:

DateTimeFormatter patternFormat = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");

Si vous voulez avoir le même format mais sans les millisecondes, le modèle pourrait ressembler à ceci:

DateTimeFormatter patternFormat = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss'Z'");

Je suis sûr que vous avez trouvé cette page, mais consultez la page de référence Joda Time Formatting pour plus de détails concernant ces formats et d'autres options.

1
pacifier21

'Z' est le court terme pour Zulu time, qui est identique à GMT ou UTC

Je pense que c'est ce dont vous avez besoin .. !!

int offset = DateTimeZone.forID("UTC").getOffset(new DateTime());
0
Dileep