Analyser ISO horodatage à l'aide de Java 8 java.le temps de l'api (standard edition)
Je vais avoir de la difficulté à obtenir millisecondes à partir de l'époque de la chaîne dans l'exemple. J'ai essayé ce de trois façons différentes à ce jour, et le montre l'exemple de la dernière tentative. Il semble toujours à venir vers le bas pour que le TemporalAccessor ne prend pas en charge ChronoField. Si je pouvais réussir à construire une instance Instant, je pouvais utiliser toEpochMilli().
String dateStr = "2014-08-16T05:03:45-05:00"
TemporalAccessor creationAccessor = DateTimeFormatter.ISO_OFFSET_DATE_TIME.parse(dateStr);
Instant creationDate = Instant.from(creationAccessor);
Veuillez donner des réponses concises (ne pas construire un module de formatage à partir de zéro) et n'utiliser que le java 8 distribution standard (je peux le faire avec Joda, mais que vous voulez éviter les dépendances).
Edit: Instant.dans le code ci-dessus lancers: java.time.DateTimeException: Unable to obtain Instant from TemporalAccessor: {OffsetSeconds=-18000},ISO resolved to 2014-08-16T05:03:45 of type java.time.format.Parsed
OriginalL'auteur Travis Wellman | 2014-09-09
Vous devez vous connecter pour publier un commentaire.
Ce qui semble être un bug que j'ai trouvé dans toutes les versions testées avant et y compris
jdk1.8.0_20b19
mais pas dans le finaljdk1.8.0_20
. Donc le téléchargement d'une mise à jour de la version de jdk permettrait de résoudre le problème. Il est également résolu dans les plus récentes jdk1.9.Noter que le bon vieux Java 7 fonctionne dans toutes les versions:
Il prend également en charge l'obtention d'un
Instant
:Mais, comme l'a dit, une simple mise à jour votre Java 8 du code de travail.
OriginalL'auteur Holger
Votre Code Fonctionne, Comme De Java 8 Update 51
Votre code fonctionne maintenant, comme de Java 8 Update 51 sur Mac OS X Mountain Lion. Le Réponse par Holger qu'il peut y avoir un bug dans les versions antérieures de Java. Compréhensible que le java.cadre de temps est tout nouveau dans Java 8.
Ici est une copie modifiée de votre code.
De vidage de la console.
Lors de l'exécuter.
Canonique Méthode:
parse(CharSequence text, TemporalQuery<T> query)
Vous pouvez accomplir votre analyse en utilisant une autre méthode.
La classe doc pour
DateTimeFormatter
mentionne que la manière habituelle à analyser devrait être un appel àDateTimeFormatter::parse(CharSequence texte, TemporalQuery<T> query)
plutôt queDateTimeFormatter::parse(CharSequence texte)
.Ainsi, au lieu de cela:
...cela, où l'on ajoute un deuxième argument, l'argument étant un la méthode de référence en Java 8 de la syntaxe, pour appeler à la conversion
from
méthode (dans cet exemple,ZonedDateTime :: from
):De vidage de la console.
Lors de l'exécuter.
OriginalL'auteur Basil Bourque
Depuis instantanée ne peut pas être correctement représentées à l'aide d'une longue (ils ont conçu l'API pour pas Y 2040 questions, quand une longue n'est plus suffisant), vous devez utiliser une combinaison de deux méthodes
getEpochSecond()
et
getNano()
L'ancien vous obtient le nombre de secondes depuis l'epoch, et ce dernier vous donne le n ° de nanosecondes qui se sont écoulées depuis que la même seconde.
Une longue valeur en millisecondes va durer bien au-delà de 2040. Vous êtes le confondre avec un int deuxième valeur qui expire en 2038.
OriginalL'auteur Matt
Instant.à partir de(creationAccessor).toEpochMili() doit trier vous, au moins selon les ThreeTen javadoc pour TemporalInstant. ThreeTen est l'implémentation de référence de javax.temps. Laissez-moi savoir si cela fonctionne pour vous ou pas en laissant un commentaire.
D'ici à 2040-ish, il faut espérer être remplacé par javax.datetimetwentythirtyeight de toute façon.
Plus je la regarde de temps donnée et wikipedia de la taille de l'échantillon, plus j'ai l'impression que c'est un JDK bug... soupir
OriginalL'auteur hd1