Question

J'ai essayé de faire valeur date fixée à un PreparedStatement avec une valeur par défaut, mais la valeur est parfois retourné comme JulianValue. Par exemple (on suppose spanBegin et spanEnd sont nuls)

Calendar cal = new GregorianCalendar();
if (spanBegin == null) {
    cal.set(0000, Calendar.JANUARY, 1);
    spanBegin = cal.getTime();
}

if (spanEnd == null)
{
    cal.set(9999, Calendar.DECEMBER, 31);
    spanEnd = cal.getTime();
}

Sur la ligne numéro 3, depuis la date du 1er Janvier, 0000 est scope par un calendrier julien, le CDate devient un calendrier julien. Cependant, la prochaine date même si elle est dans l'année 9999, son CDate devient un calendrier julien encore. Je devais créer une autre instance de calendrier grégorien pour résoudre le problème.

Calendar cal = new GregorianCalendar();
if (spanBegin == null) {
    cal.set(0000, Calendar.JANUARY, 1);
    spanBegin = cal.getTime();
}

Calendar cal = new GregorianCalendar();
if (spanEnd == null)
{
    cal.set(9999, Calendar.DECEMBER, 31);
    spanEnd = cal.getTime();
}

La question est, est-ce un comportement attendu ou un bug sur l'objet de la date? En fait, en utilisant GregorianCalendar.getInstance () montre que le cdate est parfois défini sur JulianCalendar.

Était-ce utile?

La solution

Quelle est la version de Java que vous utilisez et sur quel système d'exploitation? Avez-vous vraiment besoin de stocker les dates dans les années 0 et 9999, ou êtes-vous simplement les utiliser comme « l'infini » et les valeurs « positives » à l'infini? Comment voyez-vous exactement faire que le calendrier est un calendrier julien?

J'ai essayé ceci:

Calendar cal = Calendar.getInstance();

cal.set(0, Calendar.JANUARY, 1);
Date d1 = cal.getTime();

cal.set(9999, Calendar.DECEMBER, 31);
Date d2 = cal.getTime();

System.out.println(d1);
System.out.println(d2);

Sortie (sous Windows XP, en utilisant Sun Java 1.6.0_16):

Thu Jan 01 09:53:56 CET 1 java.util.Date
Tue Dec 31 09:53:56 CET 9999 java.util.Date

Il change l'année 0 à l'année 1. Modification du code pour utiliser un second objet de calendrier pour la deuxième date:

Calendar cal = Calendar.getInstance();

cal.set(0, Calendar.JANUARY, 1);
Date d1 = cal.getTime();

Calendar cal2 = Calendar.getInstance();
cal2.set(9999, Calendar.DECEMBER, 31);
Date d2 = cal2.getTime();

System.out.println(d1);
System.out.println(d2);

Cela ne change rien à la sortie ou le contenu des deux objets Date.

Note: Attention que les littéraux entiers qui commencent par un 0, comme 0000 dans votre code, sera interprété comme un nombre octal par le compilateur Java. Cela n'a pas d'importance dans ce cas parce que le nombre est 0, mais vous ne devriez pas préfixer littéraux entiers avec des zéros si vous ne les veut pas dire que les numéros de octal.

Autres conseils

Il n'y avait pas le calendrier grégorien jusqu'à 1582. Le calendrier julien a été utilisé dans toute l'Europe, jusqu'à ce que des problèmes mineurs ont commencé à apparaître causé par le fait que l'année solaire n'est pas exactement 365,25 jours, mais un peu moins que cela. Pour arranger les choses, le pape Grégoire XIII ordonna de changer le calendrier à ce que nous connaissons aujourd'hui - chaque année qui divise par 100 est pas une année bissextile, à moins qu'il divise par 400. En Octobre 1582, Guillaume de la transition - le lendemain 4 octobre ont 15 octobre Cela signifie que jusqu'en 1582 Octobre, le calendrier grégorien et Julian calendriers sont les mêmes. Vous pouvez en lire davantage

C'est pourquoi les dates avant octobre 1582 sont convertis pour utiliser le système Julian. Selon le API Si vous avez réellement besoin pour représenter un événement historique (qui ne semble pas le cas ici), vous pouvez le faire seulement à partir du 1er mars, 4AD

Thhere est pas d'année 0 dans le calendrier julien. Il va de 1 à 1 BC AD.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top