SimpleDateFormat ne peut pas analyser les millisecondes avec plus de 4 chiffres
Je veux analyser un timestamp, comme ce - "2016-03-16 01:14:21.6739"
. Mais quand j'utilise le SimpleDateFormat
à l'analyser, je trouve qu'elle donne une mauvaise valeur analysée. Il secrètes 6739 millisecondes à 6 secondes avec 739 millseconds gauche. Il convertis à la date de ce format - Wed Mar 16 01:14:27 PDT 2016
. Pourquoi la secondes partie a changé à partir de 21 secondes à 27 secondes(plus de 6 secondes?). Voici mon extrait de code:
final SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSS");
String parsedate="2016-03-16 01:14:21.6739";
try {
Date outputdate = sf.parse(parsedate);
String newdate = outputdate.toString(); //==output date is: Wed Mar 16 01:14:27 PDT 2016
System.out.println(newdate);
} catch (ParseException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
Rappelez-vous que une milliseconde est de 0,001 seconde. Donc à quatre chiffres de l'ordre de la milliseconde plus de 1 sec.
oui, a changé à la sortie de la date du présent code:String newdate = sf.format(outputdate); mais il est encore de sortie: 2016-03-16 01:14:27.0739 ????
oui, a changé à la sortie de la date du présent code:String newdate = sf.format(outputdate); mais il est encore de sortie: 2016-03-16 01:14:27.0739 ????
OriginalL'auteur Alter Hu | 2016-03-17
Vous devez vous connecter pour publier un commentaire.
Il semble que n'est pas possible d'utiliser SimpleDateFormat pour exprimer la fois avec un grain plus fin que l'ordre de la milliseconde.
Ce qui se passe est que vous mettez 6739, Java, il comprend que 6739 millisecondes, c'est à dire 6 secondes et 739 millisecondes donc les 6 secondes de différence observée.
Vérifier celles-ci, il s'explique très bien:
Chaîne de conversion de Date avec nanosecondes
Java date de l'analyse avec la microseconde ou précision de l'ordre de la nanoseconde
Pour utiliser java 8 pour analyser le type dateTime,liste de la java8 code ci-dessous:DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.Systèmes de règlementlivraison de titres"); LocalDateTime newdate = LocalDateTime.parse(parsedate, dateTimeFormatter); le Système..println(newdate.toString());
OriginalL'auteur Bruno Piqueras
SS
dansSimpleDateFormat
est de quelques millisecondes. Vous avez 6739 millisecondes, ce qui signifie que vous sont l'ajout d'un supplément de 6,7 secondes sur votre temps. Peut-être vous pouvez tronquer le6739
à673
(ou si vous préférez, tour à674
) de sorte qu'il peut être correctement analysé comme le nombre de millisecondes.Date
prend uniquement en charge la précision à la milliseconde. Vous pas représentent2016-03-16 01:14:21.6739
comme unjava.util.Date
.Pour utiliser le package : java.temps pakcage dans java 8 a résolu mon problème: docs.oracle.com/javase/8/docs/api/java/time/...
vous avez dit que vous êtes en comparant les dates avec l'heure actuelle. Pour cette raison, vous parler de ne pas être en mesure de dépouiller le dernier chiffre de votre date. Comme une question d'intérêt: Comment obtenir la date du jour, avec le 10e de la précision à la milliseconde?
OriginalL'auteur khelwood
tl;dr
Millisecondes contre Microsecondes
Comme d'autres l'ont noté,
java.util.Date
a milliseconde. Cela signifie que jusqu'à 3 chiffres d'un nombre décimal en fraction de seconde.Vous disposez de 4 chiffres dans la chaîne d'entrée, un de trop. Votre valeur d'entrée des demandes plus la résolution est haute comme microsecondes ou nanosecondes.
java.temps
Au lieu de l'utilisation de l'imparfait, de confusion, d'inquiétude et de java.util.Date/.Calendrier des classes, de passer à leur remplacement: le java.le temps cadre intégré dans Java 8 et les versions ultérieures.
La java.les classes de temps ont un résolution de l'ordre de la nanoseconde, jusqu'à neuf chiffres de la partie décimale d'une fraction de seconde. Par exemple:
ISO 8601
Votre chaîne d'entrée est presque dans la norme ISO 8601 format utilisé par défaut en java.de temps lors de l'analyse, produire des représentations textuelles de la date-heure de valeurs. Remplacer cet espace dans le milieu avec un
T
pour se conformer à la norme ISO 8601.Unzoned
Un
LocalDateTime
est une approximation de la date-heure, sans n'importe quel fuseau horaire du contexte. Pas un moment sur la timeline.UTC
Faire que
LocalDateTime
un moment sur la timeline en appliquant le temps prévu de la zone. Destiné à l'UTC, faire unInstant
.Zoné
Destiné à un moment particulier de la zone, spécifiez un
ZoneId
pour obtenir unZoneDateTime
.LocalDateTime.parse( input );
vous perdez les informations de fuseau horaire (si il y a de tout dans la chaîne d'origine)Je crois que vous avez manqué le point. La chaîne d'entrée de la Question n'a pas de décalage-de-UTC et pas de temps horaire. Nous avons donc analyser une entrée défaut offset/zone à l'aide d'une classe de défaut offset/zone. Rien de perdu. Ni la chaîne d'entrée, ni le
LocalDateTime
objet de représenter un moment précis dans le temps, seulement quelques instants sur un 26-27 heure de gamme. Relisez ma Réponse pour plus de détails.OriginalL'auteur Basil Bourque
Vous pouvez utiliser Chaîne newdate = sf.format(outputdate); en place de Chaîne newdate = outputdate.toString();
OriginalL'auteur visingh
Un peu hors-sujet, mais
SimpleDateFormat
classe n'est pas thread-safe - non seulement sur l'analyse, ce qui est assez compréhensible, mais aussi sur la mise en forme. il y a beaucoup d'info sur ce sur le net, en voici un exemple: http://javarevisited.blogspot.co.il/2012/03/simpledateformat-in-java-is-not-thread.html. Ce problème ne sera pas résolu. Dans Java 8, il est un tout nouveau packagejava.time
merveilleux avec de nouvelles fonctionnalités permettant de travailler avec plein ou partiel, les dates et les heures. Il y a aussi une nouvelle classe DateTimeFormatter qui fournit considérablement amélioré la mise en forme et l'analyse des caractéristiques. Toutefois, si vous utilisez java âgés de plus de java 8 ensuite, la recommandation serait d'utiliser Joda time library ou Apache FastDateFormatComme je l'ai dit, ma réponse est hors-sujet. Je n'ai jamais dit que ces 2 options à résoudre la question de précision. J'ai juste dit qu'ils sont préférables à SimpleDateFormat en avant java 8 versions. Comme vous pouvez le voir, j'ai aussi fortement recommandé d'utiliser java-8 si possible. Je ne suis pas d'accord avec votre downvote, mais c'est votre opinion et votre droit.
Merci de lire mon commentaire encore une fois, je ne suis PAS le downvoter. 😉 mais juste spéculé pourquoi quelqu'un d'autre a downvoted vous.
OK, Ménon, désolé alors, je suppose que j'ai aboyé au mauvais arbre. - Je mal compris. J'ai pensé que ce que vous disiez était qu'en général, vous n'êtes pas le downvoter, mais dans ce cas, vous avez senti que le downvote était bien méritée.
OriginalL'auteur Michael Gantman
Si vous avez à la chaîne de sortie final pourquoi ne pas utiliser
format
au lieu deparse
et au lieu de
"yyyy-MM-dd HH:mm:ss.SSSS"
utilisation"yyyy-MM-dd HH:mm:ss.SSSZ"
le vérifier ici https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.htmlvous pouvez faire de la sf.setTimeZone(Fuseau horaire.getTimeZone("UTC"));
OriginalL'auteur Raunak Kathuria
Comme mentionné dans les commentaires au-dessus de votre question contient déjà la réponse: millisecondes ne doit pas avoir plus de 3 chiffres autrement qu'elle représente au moins une seconde déjà.
Que votre code est le travail, c'est simplement à cause de la très discutable en fonction de
java.text.SimpleDateFormat
, le clémente (voir ici). Par défaut, unSimpleDateFormat
asetLenient
ensemble detrue
qui signifie que l'analyseur va essayer d'interpréter les chaînes qui ne correspond pas au modèle 100% et les convertir à la date d'objets à l'aide de quelques heuristiques. Par exemple, il accepte une date31.04.2016
et la convertir en01.05.2016
. Cette fonctionnalité peut être sympa dans certaines situations, mais produit des résultats douteux, dans la plupart des cas.Si vous définissez clémente
false
dans votre code, la chaîne de date ne sera pas analysée plus. Fait l'erreur dans le motif le plus évident:Comme
java.util.Date
n'est pas en mesure de représenter toute précision inférieure à millisecondes, je pense que la meilleure option pour vous d'analyser votre date serait tout simplement de bande de l'derniers chiffres de votre date d'entrée, si la partie après le point a plus de quatre chiffres. Votre code pourrait ressembler à quelque chose comme ceci:Vous pourriez essayer d'ajouter de la logique de l'arrondi ainsi afin de ne pas perdre toutes les informations de la 4ème chiffre...
Je ne comprends pas ce que ma réponse a à voir avec le débogage. Mais si vous ne voulez pas les perdre de la 10e de la précision à la milliseconde vous devriez probablement utiliser java.les classes de temps à la place. Voir DateTimeFormatter
OriginalL'auteur dpr