Comment puis-je convertir 2010-12-15T16: 26: 49,841 à 08: 00 à un GregorianCalendar en Java? [dupliquer]
-
10-10-2019 - |
Question
Cette question a déjà une réponse ici:
J'ai une date de chaîne « 2010-12-15T16: 26: 49,841 à 08: 00 » et je dois le convertir en un GregorianCalendar en Java. Comment faites-vous cela?
Solution de la réponse de Jesper
Code pour la solution en utilisant le temps de Joda:
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ").withOffsetParsed();
DateTime date = formatter.parseDateTime("2010-12-15T16:26:49.841-08:00");
La solution
Malheureusement, la classe standard SimpleDateFormat
ne peut pas gérer format ISO 8601 très bien. Plus précisément, il ne peut pas gérer la :
qui est dans le fuseau horaire de décalage à la fin.
Ce que vous pouvez faire est de supprimer manuellement le :
du décalage horaire, de sorte que vous obtenez une chaîne qui ressemble à ceci:
2010-12-15T16:26:49.841-0800
(notez que le décalage horaire est -0800
au lieu de -08:00
). Ensuite, vous pouvez l'analyser avec SimpleDateFormat
avec le format yyyy-MM-dd'T'HH:mm:ss.SSSZ
.
Mais il est préférable d'utiliser la bibliothèque populaire Joda-Time pour les temps de traitement et les dates; il est beaucoup mieux que la date de l'API Java standard et calendrier des classes et des poignées format ISO 8601 correctement.
Autres conseils
Utilisez SimpleDateFormat, voir javadocs ici:
convertir ensuite la date au calendrier. Jetez un oeil à beaucoup d'exemples ici:
Vous pouvez essayer avec ce morceau de code
DateTimeFormatter formatter =
DateTimeFormat.forPattern("your pattern").withOffsetParsed();
DateTime dateTime = formatter.parseDateTime("your input");
GregorianCalendar cal = dateTime.toGregorianCalendar();
Cela vous donnera certainement le calendrier grégorien Objet
String dateTimeString="2010-12-15T16:26:49.841-08:00";
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
DateTime dateTime = formatter.parseDateTime(dateTimeString);
GregorianCalendar cal = dateTime.toGregorianCalendar();
Les autres réponses sont correctes mais maintenant dépassée. Ils utilisent des classes ennuyeuses vieilles maintenant supplanté par le cadre de java.time.
Utilisation java.time
La chaîne d'entrée arrive à se conformer aux ISO 8601 mise en forme standard. Donc pas besoin de spécifier un modèle de formatage comme les classes java.time utilisent ISO 8601 par défaut lors de l'analyse / génération de chaînes.
La chaîne d'entrée comprend un offset de-UTC, donc on parse comme OffsetDateTime
.
String input = "2010-12-15T16:26:49.841-08:00" ;
OffsetDateTime odt = OffsetDateTime.parse( input );
Si vous avez un fuseau horaire spécifique à l'esprit, plutôt qu'une simple offset de-UTC, appliquer cela.
ZoneId zoneId = ZoneId.of( "America/Los_Angele" );
ZonedDateTime zdt = odt.atZone( zoneId );
GregorianCalendar
Vous devez éviter les anciennes classes de date-heure, comme GregorianCalendar
. Mais si vous devez interopérer avec l'ancien code non encore mis à jour pour java.time, vous pouvez convertir. Utiliser de nouvelles méthodes ajoutées aux anciennes classes de conversion. Pour plus d'informations et un schéma astucieux, voir mon Question et réponse .
Calendar cal = java.util.GregorianCalendar.from( zdt ); // Do such conversions out of java.time only if absolutely necessary.
A propos de java.time
Le java.time cadre est construit en Java 8 et versions ultérieures. Ces classes remplacent les anciennes classes date temps gênants tels que java.util.Date
, .Calendar
, et java.text.SimpleDateFormat
.
Le projet du Joda-Time, maintenant mode maintenance , conseille la migration vers java.time.
Pour en savoir plus, consultez le Oracle Tutoriel . Et la recherche Stack Overflow pour de nombreux exemples et explications.
La plupart des fonctionnalités de java.time est de retour à Java 6 portage et 7 ThreeTen-Backport et en outre adapté pour applications ThreeTenABP .
Le projet ThreeTen-Extra étend java.time avec des classes supplémentaires. Ce projet est un terrain d'essai pour des ajouts futurs possibles à java.time. Vous trouverez peut-être des classes utiles ici, comme Interval
, YearWeek
, YearQuarter
, et plus encore.