J'ai besoin de convertir une date de chaîne en un autre format de chaîne date
String current = "Tue Apr 16 10:59:11 EDT 2019";
Je souhaite obtenir la date de résultat Chaîne au format ISO-8601 conformément au modèle - "aaaa-MM-jj 'T'HH: mm: ss.SSSXX "
Pourriez-vous s'il vous plaît m'aider à mettre en œuvre ceci?
3 Réponses :
Il y a un SimpleDateFormat
en java, et il y a une méthode d'analyse dedans
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); String dateString = format.format( new Date() ); Date date = format.parse ( "2009-12-31" );
votre chaîne de format dans le constructeur SimpleDateFormat ne correspond pas au format de date @liotur
Il existe une analyse et une méthode de formatage. OP aura besoin de deux formats de date, l'un pour analyser leur chaîne dans une date / heure, l'autre pour formater cette date / heure dans une autre chaîne.
Veuillez ne pas apprendre aux jeunes à utiliser la classe SimpleDateFormat
, obsolète depuis longtemps et notoirement gênante. Du moins pas comme première option. Et pas sans aucune réserve. Aujourd'hui, nous avons tellement mieux dans java.time
, le Java moderne API de date et d'heure et son DateTimeFormatter
.
Aucune des classes de temps de Java n'implémente pleinement ISO 8601, mais vous pouvez essayer avec Java 8:
ZonedDateTime zp = ZonedDateTime.parse(string); Date date = Date.from(zp.toInstant()); SimpleDateFormat dt1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXX"); System.out.println(dt1.format(date));
Pourquoi mélangez-vous les classes de temps java.util. * Avec les classes java.time. *? Ils ne sont pas conçus pour aider lorsqu'ils sont mélangés. Eh bien, il y a une raison pour laquelle les classes java.time. * Ont été inventées malgré l'existence précédente et insatisfaisante des autres.
@kumesana Bien sûr, vous pouvez utiliser LocalDateTime à la place de Date si cette suite en a besoin.
Il ne s'agit pas de peut , il s'agit de devrait . Utilisez les classes de temps java.util. * Ou java.time. *. Cela fonctionne bien et très bien. Ne les mélangez pas. Cela force une bizarrerie inutile et encourage à faire des choses qui ne fonctionnent pas comme le programmeur l'avait imaginé. Cependant, mieux vaut ne pas utiliser du tout les classes de temps java.util. *, Compte tenu de la qualité de java.time. *.
De plus, cela ne fonctionnera pas avec la chaîne de la question (convenez que dans Java 8, vous devez rester loin de SimpleDateFormat
et des autres classes anciennes et gênantes).
En utilisant l'API Java8 DateTime, vous pouvez faire quelque chose comme ceci:
//format your zonedDateTime with a new provided pattern String test = zonedDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSXX")); //print it System.out.println(test);
Obtenez-le dans le format de votre choix:
//your input String date = "Tue Apr 16 10:59:11 EDT 2019"; //create new formatter for parsing your input DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE MMM d HH:mm:ss zzz yyyy", Locale.ENGLISH); //create new zonedDateTime from parsing an input with provided formatter ZonedDateTime zonedDateTime = ZonedDateTime.parse(date,formatter);
Est-ce que EDT est l'heure avancée de l'Est australien, l'heure avancée de l'Est de l'Amérique du Nord ou autre chose? Oui, je sais que l’été a pris fin dans la majeure partie de l’Australie le 7 avril, mais je tenais à souligner que les abréviations de fuseau horaire à trois lettres sont souvent ambiguës, vous ne devriez donc pas vous y fier. Il semble également que vous ayez obtenu la sortie de
Date.toString ()
. Mieux vaut convertir l'objetDate
lui-même.liotur, je ne prétends pas que cette question soit une copie exacte de chacune des questions auxquelles j'ai lié. Si vous combinez plutôt les informations de deux ou plusieurs des questions liées, je pense que vous devriez être en mesure d'effectuer la conversion que vous souhaitez. Vous pouvez également rechercher, bien sûr, et vous en trouverez certainement plus.