2017-05-26 1 views
2

Pour l'un des projets, j'ai reçu une milliseconde d'un autre système. Je besoin de convertir en "aaaa-DDDT: HH: mm: ssZ"Moment de mise en forme time4j

L'astuce consiste à afficher dans bissextile deuxième.

Puisque les bibliothèques Java n'a pas bissextile secondes, j'ai décidé d'utiliser Time4J « s Moment classe.

Mais Le moment toString() est l'impression yyyy-MM-ddTHH:mm:ss.

Est-il possible d'obtenir jour de l'année dans la classe Moment?

Existe-t-il un exemple pour créer un formateur personnalisé. J'ai essayé quelques-uns, y compris ChronoFormatter. mais n'a pas pu obtenir les résultats souhaités.

Une solution de contournement méchant est d'utiliser Calendar pour Date de partie Moment pour temps partie.

Mais c'est fastidieux, et sera difficile lors de l'analyse de String.

Répondre

1

Mise en forme ou l'analyse syntaxique des moments/instants avec l'élément jour d'année est pas de problème particulier avec la classe Moment et peut être fait simplement en choisissant un suitable pattern, voir cette démonstration pour un saut deuxième:

Moment ls = PlainTimestamp.of(2016, 12, 31, 23, 59, 59).atUTC().plus(1, SI.SECONDS); 
System.out.println(ls); // 2016-12-31T23:59:60Z 
ChronoFormatter<Moment> f = 
    ChronoFormatter.ofMomentPattern(
     "uuuu-DDD'T'HH:mm:ssX", PatternType.CLDR, Locale.ROOT, ZonalOffset.UTC); 
String text = f.format(ls); 
System.out.println(text); // 2016-366T23:59:60Z 
Moment parsed = f.parse(text); 
System.out.println(parsed.isSimultaneous(ls)); // true 

Gardez à l'esprit que tout conversion de Moment -objets à par exemple java.time.Instant ou java.util.Date perdra cependant l'information de seconde intercalaire. Autre point: L'accès à l'élément de jour de l'année dans la classe Moment n'est pas directement possible car le jour de l'année est un élément local non lié à l'heure universelle sans décalage de zone mais peut être effectué par programmation si vous spécifiez également un décalage de zone ou un fuseau horaire. Exemple:

System.out.println(ls.get(PlainDate.DAY_OF_YEAR.at(ZonalOffset.UTC))); // 366 

La même procédure peut également être appliquée à des éléments de temps:

System.out.println(ls.get(PlainTime.SECOND_OF_MINUTE.at(ZonalOffset.UTC))); // 60 

A propos du dernier exemple: Il ne fonctionne que dans le contexte de Moment mais pas dans le contexte du type local PlainTime, bien sûr. Le support de seconde intercalaire est profondément intégré dans Time4J à tous les niveaux lors de la gestion de la classe Moment, par programmation et lors de la mise en forme et de l'analyse.

+0

Merci beaucoup! – william