Joda Time analyser une date avec le fuseau horaire et de retenir que le fuseau horaire
Je veux analyser une date, qui a été créé avec un fuseau horaire, la convertir en un format et de le retourner. La conversion fonctionne, mais le décalage horaire est toujours réglé à +0000 avec la différence de temps d'être ajoutés ou soustraits en tant que de besoin. Comment puis-je obtenir de format et de garder le décalage correct?
Je m'attends à ce: 2012-11-30T12:08:56.23+07:00
Mais voilà: 2012-11-30T05:08:56.23+00:00
Mise en œuvre:
public static final String ISO_8601_DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSZZ";
public static String formatDateToISO8601Standard(Date date) {
DateTime dateTime = new DateTime(date);
DateTimeFormatter df = DateTimeFormat.forPattern(ISO_8601_DATE_FORMAT);
return dateTime.toString(df);
}
De la classe de Test:
private static final String DATE_WITH_TIMEZONE = "30 11 2012 12:08:56.235 +0700";
private static final String EXPECTED_DATE_WITH_TIMEZONE = "2012-11-30T12:08:56.23+07:00";
@Test public void testFormattingDateWithSpecificTimezone() throws Exception {
String result = JodaDateUtil.formatDateToISO8601Standard(createDate(DATE_WITH_TIMEZONE));
assertEquals("The date was not converted correctly", EXPECTED_DATE_WITH_TIMEZONE, result); }
private Date createDate(String dateToParse) throws ParseException {
DateTimeFormatter df = DateTimeFormat.forPattern("dd MM yyyy HH:mm:ss.SSS Z");
DateTime temp = df.parseDateTime(dateToParse);
Date date = temp.toDate();
return date; }
Vous devez vous connecter pour publier un commentaire.
Fondamentalement, une fois que vous analyser la chaîne de date [dans votre createDate() la méthode] vous avez perdu la zone d'origine. Joda-Time vous permettra de formater la date à l'aide de n'importe quelle zone, mais vous aurez besoin de garder la zone d'origine.
Dans votre createDate() la méthode, la DateTimeFormatter "df" peut renvoyer à la zone qui a été sur la chaîne. Vous aurez besoin d'utiliser la withOffsetParsed() méthode. Alors, quand vous avez votre DateTime, appel getZone(). Si vous enregistrez cette zone quelque part ou quelque sorte de le passer à votre mise en forme de routine, alors vous pouvez l'utiliser par la création d'un DateTimeFormatter "withZone" et en précisant que la zone que celle que vous souhaitez sur le format.
Comme une démo, voici un exemple de code dans une méthode unique. Espérons-le, il vous permettra de modifier votre code de la façon dont vous voulez qu'il fonctionne.
tl;dr
Détails
Accepté la Réponse est correcte. Dès que vous convertir à une
java.util.Date
objet, vous perdez les informations de fuseau horaire. Ceci est compliqué par le fait quejava.util.Date::toString
de prêter à confusion, s'applique un courant fuseau horaire par défaut lors de la génération de la Chaîne.Éviter l'utilisation de ces vieilles date à temps des classes comme
java.util.Date
. Ils sont mal conçus, de la confusion, et gênants. Maintenant héritage, supplanté par le java.le temps du projet. C'est aussi le Joda-Time de projet aujourd'hui supplanté par le java.les classes de temps.java.temps
Analyser cette chaîne d'entrée comme un
OffsetDateTime
objet en tant qu'il comprend un offset-de-UTC mais manque un fuseau horaire. AppelDateTimeFormatter.ofPattern
pour spécifier un format personnalisé correspondant à votre chaîne d'entrée. Passer que l'objet de formatage deOffsetDateTime.parse
.Voir même moment, à l'UTC, extrait d'un
Instant
. LeInstantané
classe représente un moment dans le scénario de UTC avec une résolution de nanosecondes (jusqu'à neuf (9) chiffres d'une fraction décimale).Vous pouvez appliquer n'importe quelle heure de la zone à travers laquelle vous souhaitez afficher le même moment, le même point sur la timeline.
Pas besoin de mélanger dans la vieille date-heure en cours. Bâton avec java.temps. Si vous devez utiliser un ancien code pas encore mis à jour pour java.les types d'heures, de regarder, de nouvelles méthodes ajoutées aux anciennes classes de convertir vers/à partir de java.temps.
L'équivalent de
java.util.Date
estInstant
, étant à la fois un compte depuis l'époque de1970-01-01T00:00:00Z
en UTC. Mais méfiez-vous de la perte de données comme le java.les classes de temps de soutien de la nanoseconde résolution, mais les anciennes classes sont limitées à quelques millisecondes.De code en direct
Voir live code de travail dans IdeOne.com.
Sur java.temps
La java.le temps cadre est intégré dans Java 8 et les versions ultérieures. Ces classes permettent d'éviter la pénible vieux héritage date du temps des classes comme
java.util.Date
,.Agenda
, &java.texte.SimpleDateFormat
.La Joda-Time projet, maintenant dans le mode de maintenance, conseille la migration vers java.temps.
Pour en savoir plus, consultez les Oracle Tutoriel. Et de recherche de Débordement de Pile pour de nombreux exemples et des explications. La spécification est JSR 310.
Où obtenir le java.les classes de temps?
La ThreeTen-Extra projet s'étend java.temps avec d'autres classes. Ce projet est un terrain d'essai pour de possibles futurs ajouts à java.temps. Vous pouvez trouver quelques classes utiles ici comme
Intervalle
,YearWeek
,YearQuarter
, et plus.import
états pour éviter la collision de la classe et de la méthode des noms (comme vous l'avez vu).De l'essayer.
ensuite de les convertir au format que vous désirez.
ISODateTimeFormat.dateTimeParser().withOffsetParsed().parseDateTime(dateString);
Utiliser le format
val formateur = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss.SSSZZ")