2016-11-29 3 views
0

J'ai une date dans la chaîne "0002-01-04T00: 49: 40.000", c'est-à-dire une date de l'année 2CE . J'ai besoin de le convertir en une instance de java.util.Date en le combinant avec l'identifiant de fuseau horaire "Etc/UTC". Le code suivant montre comment je le fais:Conversion d'un LocalDateTime de l'année 2CE par un jour lors de la conversion en java.util.Date

public static Date toDate(LocalDateTime localDateTime, String timezoneId){ 
    if(localDateTime == null) return null; 
    if(timezoneId != null) { 
     localDateTime.toDateTime(DateTimeZone.forID(timezoneId)).toDate(); 
    } else { 
     return localDateTime.toDateTime().toDate() 
    } 
} 

Mais LocalDateTime.toDate() ne fonctionne pas correctement. Il ajoute +1 jour à ce jour.

"0002-01-04T00: 49: 40.000Z" ---> "Jeu Jan 05 16:49:40 PST 2".

+4

double possible de [Comment convertir la chaîne de datetime à ce jour en utilisant GWT?] (Http://stackoverflow.com/questions/11342670/how-to-convert-string-of-datetime-to-date -using-gwt) – DimaSan

+0

'toDate()' est la méthode de [JodaTime] (http://www.joda.org/joda-time/). – DimaSan

+0

'java.util.Date.toString()' utilise le calendrier julien pour l'année 0002! Donc je ne vois pas de problème ou d'échec. –

Répondre

3

Comme indiqué dans mon commentaire, il n'y a pas d'erreur. Tout est correct bien que vous n'attendiez pas le résultat que vous avez observé. Par conséquent, je vais l'expliquer en détail. Exemple de code en fonction de votre méthode d'assistance:

System.out.println(
    toDate(org.joda.time.LocalDateTime.parse("0002-01-04T00:49:40.000"), "GMT") 
); // Fri Jan 06 01:49:40 CET 2 

La sortie est basée sur la méthode java.util.Date.toString(). La chose confusion au sujet de cette méthode est:

  • Il utilise le temps de système zone (dans mon cas GMT + 01: 00). D'où ce détail explique pourquoi - dans mon cas - le temps est d'une heure en avance (et dans votre cas 8 heures de retard UTC en raison de votre zone PST). Si l'on considère que le temps nous nous attendons que la date le même jour pour GMT + 01 et un jour plus tôt pour PST ...

  • Moins connu mais très important: La sortie de java.util.Date.toString() utilise un calendrier mixte avec coupe-vent grégorien réglé à 1582-10-15. Avant cette date, le calendrier julien est utilisé. Et vous utilisez l'année 0002! Donc, ici nous comparons la partie de la période grégorienne proleptique de Joda-Time avec une date de calendrier Julian. Pour l'année 0002, il y a deux jours de différence entre les deux calendriers en raison des différentes règles de l'année bissextile. Le calendrier julien a deux jours d'avance sur l'année 0002. Comment comprendre ces deux jours? Les années 100, 200, 300, 500, 600, 700, 900, 1000, 1100, 1300, 1400 et 1500 ne sont pas des années bissextiles dans le calendrier grégorien tandis que les années bissextiles dans le calendrier julien => 12 jours de différence. Mais le pape Gregor avait supprimé 10 jours en 1582 (le lendemain 1582-10-04 était 1582-10-15). D'où: 12 - 10 = 2 jours delta pour les années avant l'an 100 et après 99 av.

  • Résumant: [0002-01-04] moins un jour (correction de temps pour PST) plus deux jours (correction du calendrier) dans les résultats [0002-01-05] ce que vous observez.