web-dev-qa-db-fra.com

Formater Instant en chaîne

J'essaye de formater un Instant en String en utilisant le nouveau Java 8 time-api et un modèle:

Instant instant = ...;
String out = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(instant);

En utilisant le code ci-dessus, je reçois une exception qui se plaint d'un champ non pris en charge:

Java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: YearOfEra
    at Java.time.Instant.getLong(Instant.Java:608)
    at Java.time.format.DateTimePrintContext.getValue(DateTimePrintContext.Java:298)
    ...
179
Dag

Fuseau horaire

Pour formater un Instant a fuseau horaire est requis. En l'absence de fuseau horaire, le formateur ne sait pas comment convertir l'instant en champs date-heure humains et, par conséquent, lève une exception.

Le fuseau horaire peut être ajouté directement au formateur à l'aide de withZone() .

DateTimeFormatter formatter =
    DateTimeFormatter.ofLocalizedDateTime( FormatStyle.SHORT )
                     .withLocale( Locale.UK )
                     .withZone( ZoneId.systemDefault() );

Génération de chaîne

Maintenant, utilisez ce formateur pour générer la représentation sous forme de chaîne de votre Instant.

Instant instant = Instant.now();
String output = formatter.format( instant );

Dump à la console.

System.out.println("formatter: " + formatter + " with zone: " + formatter.getZone() + " and Locale: " + formatter.getLocale() );
System.out.println("instant: " + instant );
System.out.println("output: " + output );

Quand couru.

formatter: Localized(SHORT,SHORT) with zone: US/Pacific and Locale: en_GB
instant: 2015-06-02T21:34:33.616Z
output: 02/06/15 14:34
234
JodaStephen
public static void main(String[] args) {

    DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
            .withZone(ZoneId.systemDefault());

    System.out.println(DATE_TIME_FORMATTER.format(new Date().toInstant()));

}
22
二叉树

La classe Instant ne contient pas d'informations de zone, elle ne stocke que l'horodatage en millisecondes à partir d'UNIX Epoch, c'est-à-dire le 1er janvier 1070 à partir de l'UTC. Le formateur ne peut donc pas imprimer une date car la date est toujours imprimée pour un fuseau horaire précis. Vous devez définir le fuseau horaire sur Formatter et tout ira bien, comme ceci:

Instant instant = Instant.ofEpochMilli(92554380000L);
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT).withLocale(Locale.UK).withZone(ZoneOffset.UTC);
assert formatter.format(instant).equals("07/12/72 05:33");
assert instant.toString().equals("1972-12-07T05:33:00Z");
16
stokito
DateTimeFormatter.ISO_INSTANT.format(Instant.now())

Cela vous évite d'avoir à convertir en UTC. Cependant, les cadres temporels d'une autre langue peuvent ne pas prendre en charge les millisecondes, vous devriez donc le faire.

DateTimeFormatter.ISO_INSTANT.format(Instant.now().truncatedTo(ChronoUnit.SECONDS))
11

Ou si vous voulez toujours utiliser le formateur créé à partir de pattern, vous pouvez simplement utiliser LocalDateTime au lieu d’Instant:

LocalDateTime datetime = LocalDateTime.now();
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(datetime)
2
Nik.exe