Comment créer Java instant de modèle?
Envisager un code:
TemporalAccessor date = DateTimeFormatter.ofPattern("yyyy-MM-dd").parse("9999-12-31");
Instant.from(date);
La dernière ligne déclenche une exception:
Unable to obtain Instant from TemporalAccessor: {},ISO resolved to 9999-12-31 of type java.time.format.Parsed
Comment créer Instant
de yyyy-MM-dd
modèle?
D'abord je voudrais essayer une année inférieure à 9999 ;D par exemple essayer avec de 2016.
Utilisation LocalDate.parse(), de le transformer en LocalDateTime par le choix d'un temps (atStartOfDay?), de le transformer en un ZonedDateTime par le choix d'un fuseau horaire (la date de représenter un instant en France? Au royaume-UNI? dans le Japon?), ensuite transformer le ZonedDateTime pour un Instant.
Un instant, un instant. 31-12-9999 est une date, mais pas un instant. Ainsi, vous pouvez l'analyser pour un LocalDate si une date est tout ce dont vous avez besoin, ou vous aurez à spécifier les bits manquants (une fois de + une zone de décalage de temps ou de zone).
Connexes stackoverflow.com/questions/23215299/...
Utilisation LocalDate.parse(), de le transformer en LocalDateTime par le choix d'un temps (atStartOfDay?), de le transformer en un ZonedDateTime par le choix d'un fuseau horaire (la date de représenter un instant en France? Au royaume-UNI? dans le Japon?), ensuite transformer le ZonedDateTime pour un Instant.
Un instant, un instant. 31-12-9999 est une date, mais pas un instant. Ainsi, vous pouvez l'analyser pour un LocalDate si une date est tout ce dont vous avez besoin, ou vous aurez à spécifier les bits manquants (une fois de + une zone de décalage de temps ou de zone).
Connexes stackoverflow.com/questions/23215299/...
OriginalL'auteur Cherry | 2016-06-07
Vous devez vous connecter pour publier un commentaire.
La chaîne "9999-12-31" ne contient que des informations sur une date. Il ne contient pas toutes les informations à propos de l'heure du jour ou de compensation. En tant que tel, il n'y a pas suffisamment d'information pour créer un
Instant
. (D'autres la date et l'heure bibliothèques sont plus clémentes, maisjava.time
évite le défaut de ces valeurs)Votre premier choix est d'utiliser un
LocalDate
la place d'un " Instantané:Votre deuxième choix est pour le post-traitement de la date de la convertir en un instant, ce qui nécessite un temps de traitement de la zone, ici choisi d'être, Paris:
Votre troisième choix est d'ajouter le fuseau horaire pour le formateur, et par défaut le temps de la journée:
(Si cela ne fonctionne pas, assurez-vous d'avoir la dernière version de JDK 8 release comme un bug a été corrigé dans ce domaine).
Il est intéressant de noter qu'aucune de ces possibilités d'utilisation
TemporalAccessor
directement, parce que ce type est un framework de bas niveau de l'interface, pas un seul pour la plupart des développeurs d'applications pour les utiliser.parse
méthode dejava.util.Instant
ne pas prendre unDateTimeFormatter
. Au lieu de cela vous avez à faireFMT.parse("9999-31-12", Instant::from)
. Comme l'auteur pourriez-vous expliquer pourquoiInstant
est différent pour les autres classes, par exempleLocalDateTime
, à cet égard?À l'origine,
Instant
ne fonctionne pas avecDateTimeFormatter
à tous. Cela a été changé en cours de développement, mais la méthode que vous consultez n'a pas été ajouté. Cela dit, parce que de nombreux formateurs ne fonctionnent pas avecInstant
, il y a un cas de dire que l'ajout d'une telle méthode serait d'ajouter quelque chose qui échouaient souvent, et de gêner les utilisateurs.OriginalL'auteur JodaStephen
Le problème n'est pas le fait que vous êtes à l'aide de l'an 9999. Le
Instant.MAX
champ prend la valeur du timestamp1000000000-12-31T23:59:59.999999999Z
, donc 9999 une année est très bien.Traiter avec
TemporalAccessors
au lieu de la sémantiquement plus riche des types commeLocalDateTime
ouZonedDateTime
est comme l'utilisation d'unMap
de modéliser un objet et ses propriétés, au lieu d'écrire unclass
-- vous devez vous assurer que la valeur de a les champs (comme des secondes, des nanosecondes, etc) qui sont attendus par quelque chose de le recevoir, plutôt que selon officiellement déclaré opérations à un niveau supérieur de classe pour prévenir les dépendances de non satisfaits.Dans votre cas, il est probable que le temporel de l'accesseur de contenu l'analyse des champs de date, il a été donné, mais il n'a pas un "secondes" sur le terrain que les
Instant
nécessaire. Il est préférable d'utiliser le plus sémantiquement riche des types commeLocalDateTime
dans la plupart des cas.Puisque vous n'avez qu'champs de date, vous devez l'analyser comme une date, puis ajouter les champs d'heure avant de la convertir dans un Instant. Voici un moyen, à l'aide de LocalDate pour analyser la date:
OriginalL'auteur Hank D
le code ci-dessus donne le résultat suivant:
j'ai répondu à cette question en utilisant des fonctions('toInstant' méthode ' de java 8. espérons que cela répond à votre question...
oui le " toInstant () la méthode n'est disponible que dans la dernière version de java. les mentionner dans ma réponse.
pourriez-vous soin de vous expliquer. pourrais-je savoir la raison de la baisse de vote. il pourrait m'aider à améliorer ma réponse.
Je pense que la raison pour le downvote est ce que j'ai dit ci-dessus: (i) vous êtes inutilement le mélange de l'API, qui est source de confusion et (ii) de la sortie de votre exemple, dépend du fuseau horaire de l'utilisateur (si vous êtes à Hawaii, il va imprimer
2016-12-31T10:00:00Z
par exemple).OriginalL'auteur Abhishek
Soit vous êtes uniquement intéressé par la date elle-même (les 31 décembre 9999), auquel cas le type approprié serait une
LocalDate
:Ou vous voulez un
Instant
, dans ce cas, vous devez définir un horaire et d'heure, par exemple,00:00
à Tokyo:OriginalL'auteur assylias