Maison > Java > javaDidacticiel > Java.time peut-il analyser des fractions de seconde avec précision ?

Java.time peut-il analyser des fractions de seconde avec précision ?

Linda Hamilton
Libérer: 2024-10-28 16:08:02
original
255 Les gens l'ont consulté

 Can Java.time Parse Fractions of a Second Accurately?

Java.time peut-il gérer l'analyse de fractions de seconde ?

Aperçu du problème :

Dans Java 8, les tentatives d'analyse de fractions de seconde à l'aide du package java.time ont initialement abouti, mais ont ensuite rencontré des exceptions. Cet échec a persisté même lors de l'incorporation de « SS » dans le modèle de formatage pendant quelques millisecondes. Malgré la documentation indiquant la nécessité d'utiliser le même nombre de caractères de format que les chiffres d'entrée, l'application du mode strict a mal interprété le manque de caractères de fraction.

Solution :

Ce problème a été résolu dans Java 9. D'ici là, une solution de contournement impliquant l'analyse de valeurs adjacentes est disponible :

<code class="java">DateTimeFormatter dtf = new DateTimeFormatterBuilder()
  .appendPattern("yyyyMMddHHmmss")
  .appendValue(ChronoField.MILLI_OF_SECOND, 3)
  .toFormatter();</code>
Copier après la connexion

Cependant, cette approche ne gère pas l'instance spécifique de deux chiffres de fraction dans SS.

Contexte technique :

Le symbole du motif « S » représente n'importe quelle fraction de seconde, y compris les nanosecondes. L'analyse des valeurs adjacentes permet à l'analyseur de délimiter les champs séparés par des littéraux ou des séparateurs de parties temporelles.

Solutions alternatives :

En raison des limitations de JSR-310 dans la gestion de l'analyse des valeurs adjacentes, des solutions alternatives existent :

  • SimpleDateFormat (avec mises en garde) :
<code class="java">SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSS");
Date d = sdf.parse(input);</code>
Copier après la connexion
  • Bibliothèques tierces (par exemple, Joda-Time, Time4J) :
<code class="java">// Joda-Time
DateTimeFormatter dtf = DateTimeFormat.forPattern("yyyyMMddHHmmssSS");</code>
Copier après la connexion
<code class="java">// Time4J
ChronoFormatter<PlainTimestamp> f = ChronoFormatter.ofTimestampPattern("yyyyMMddHHmmssSS", PatternType.CLDR, Locale.ROOT);</code>
Copier après la connexion
  • Hack de bricolage :
<code class="java">String input = "2011120312345655";
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
int len = input.length();
LocalDateTime ldt = LocalDateTime.parse(input.substring(0, len - 2), dtf);
int millis = Integer.parseInt(input.substring(len - 2)) * 10;
ldt = ldt.plus(millis, ChronoUnit.MILLIS);</code>
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal