Changement de Date lors de la conversion de XMLGregorianCalendar de Calendrier

Lors de l'essai d'un service web que les cartes de types datetime entre les systèmes, j'ai remarqué que l'envoi de n'importe quelle date avant le calendrier Grégorien, l'heure de début a entraîné une perte de précision lors de la conversion vers le type final, avec le résultat final toujours légèrement en avance dans le temps dans l'intervalle de quelques jours.

J'ai réduit le problème à la ligne exacte, mais je n'arrive toujours pas à comprendre pourquoi c'est être jeté comme si, à partir de la la documentation il affirme que le calendrier Julien est utilisé pour datetimes avant le calendrier Grégorien début: 15 octobre 1582.

Le problème est à la distribution de XMLGregorianCalendar à GregorianCalendar, ligne 78: calendarDate = argCal.toGregorianCalendar();
Lorsque le temps est pris de calendarDate sur la ligne 86: cal.setTime(calendarDate.getTime()); vient Le temps de retour de 2 jours à l'avance de ce qu'il devrait être, Janv. 03 au lieu de Janv. 01, comme vous allez le voir à partir de la sortie dans le programme ci-dessous.

Voici un exemple de programme que j'ai fait pour montrer le processus de moulage à la fin:

import java.sql.Date;
import java.util.Calendar;
import java.util.GregorianCalendar;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
public class TestDateConversions {
public static void main(String[] args)
{
TestDateConversions testDates = new TestDateConversions();
try
{
XMLGregorianCalendar testDate1 = DatatypeFactory.newInstance().newXMLGregorianCalendar();
testDate1.setYear(0001);
testDate1.setMonth(01);
testDate1.setDay(01);
System.out.println("Start date: "+testDate1.toString() +"\n**********************");
testDates.setXMLGregorianCalendar(testDate1);
System.out.println("\nNull given \n"+ "**********");
testDates.setXMLGregorianCalendar(null);
}
catch(Exception e)
{
System.out.println(e);
}
}
public void setXMLGregorianCalendar(XMLGregorianCalendar argCal)
{
GregorianCalendar calendarDate;
if (argCal != null)
{
calendarDate = argCal.toGregorianCalendar();
System.out.println("XMLGregorianCalendar time: " + argCal.getHour() + ":"+argCal.getMinute()+":"+argCal.getSecond());
System.out.println("XMLGregorianCalendar time(ms): "+argCal.getMillisecond());
System.out.println("XMLGregorianCalendar -> GregorianCalendar: "+calendarDate.get(GregorianCalendar.YEAR) + "-"+(calendarDate.get(GregorianCalendar.MONTH)+1) + "-"+calendarDate.get(GregorianCalendar.DAY_OF_MONTH));
System.out.println("!!!!PROBLEM AREA!!!!");
Calendar cal = Calendar.getInstance();
System.out.println("-- New Calendar instance: "+cal.get(Calendar.YEAR) + "-"+(cal.get(Calendar.MONTH)+1)+"-"+cal.get(Calendar.DAY_OF_MONTH));
System.out.println("-- Calling Calendar.setTime(GregorianCalendar.getTime())");
cal.setTime(calendarDate.getTime());
System.out.println("-- calendarDate.getTime() = " + calendarDate.getTime() + " <-- time is incorrect");
System.out.println("-- Calendar with time set from GregorianCalendar: "+cal.get(Calendar.YEAR) + "-"+(cal.get(Calendar.MONTH)+1)+"-"+cal.get(Calendar.DAY_OF_MONTH) + " <-- day is increased here");
setCalendar(cal);
}
else 
{
setCalendar(null);
}
}
public void setCalendar(Calendar argCal)
{
if (argCal != null)
{
Date date = new Date(argCal.getTimeInMillis());
System.out.println("Calendar to Date: "+date);
setDate(date);
}
else
{
setDate(null);
}
}
public void setDate(Date argDate)
{
try
{
if (argDate == null)
{
Calendar cal  = new GregorianCalendar(1,0,1);
Date nullDate = new Date(cal.getTimeInMillis());
System.out.println("Null Calendar created: "+cal.get(Calendar.YEAR) + "-"+(cal.get(Calendar.MONTH)+1)+"-"+cal.get(Calendar.DAY_OF_MONTH));
System.out.println("Null Date created: "+nullDate);
}
else 
{
System.out.println("Final date type: "+argDate);
}
}
catch (Exception  ex)
{
System.out.println(ex);
}
}
}
FWIW: Le calendrier Julien n'a pas disparu instantanément en 1582. Peut-être que ce logiciel n'a vraiment qui (une mauvaise idée de l'OMI), mais qui sous-tendent le système de code ne peut pas. Merci de nous donner un exemple précis (ancienne date, la date prévue, le résultat de la date).
Je ne dis pas que tout est loin, j'ai juste souligné que toute date avant le Grégorien, le temps est en cours de modification. Mon exemple précis est assez évident qu'il y dans le code du programme, la date 0001-01-01 est en cours de modification pour 0001-01-03, et il ne devrait pas être.
Bon, pour être honnête, ça ressemble à un problème dans la bibliothèque. Comme une hypothèse, disons que c'est en essayant de la Proleptic Calendrier. Il est encore hors de Julien par le montant est erroné. Vous avez totalement raison. calendars.wikia.com/wiki/Proleptic_Gregorian_calendar --
Merci Jim. Si c'est le cas, alors je suis honnêtement pas trop sûr de l'endroit où aller à partir d'ici, je suppose que je pourrais le signaler.
Il y a peut être quelque chose de mal avec les fuseaux horaires. Sur un projet lorsque nous avons converti Date => LocalDate => Date (JodaTime dans le milieu) nous avons obtenu un résultat qui était de 15 minutes au large de la date initiale. La chose est que TZ de données de Java était plus vieux que ce Joda a (manquant 15min maj déclaré en 1891). Ce genre de choses peut se produire si vous travaillez avec une date et un mélange d'horodatage de représentation et de calendrier terrain de la représentation. Retour ensuite nous avons résolu notre problème avec Joda grâce à une méthode dédiée à cet effet -> joda-time.sourceforge.net/apidocs/org/joda/time/LocalDate.html .

OriginalL'auteur JWiley | 2013-05-01