Pregunta

He intentado hacer valor de la fecha establecida en un PreparedStatement con valor por defecto, pero el valor que a veces se devuelve como un JulianValue. Por ejemplo (Suponga spanBegin y spanEnd son null)

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();
}

En la línea número 3, ya que la fecha de 1 de enero de 0000 está en el ámbito de un calendario Juliano, el CDate se convierte en un calendario Juliano. Sin embargo, la próxima fecha, incluso si es en el año 9999, su CDate se convierte en un calendario Juliano todavía. Tuve que crear otra instancia del calendario gregoriano para solucionar el problema.

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 pregunta es, es el presente un comportamiento esperado o un error en el objeto de fecha? usando realidad GregorianCalendar.getInstance () muestra que el cdate a veces se establece en JulianCalendar.

¿Fue útil?

Solución

¿Qué versión de Java está utilizando y en qué sistema operativo? Lo que realmente necesita para almacenar fechas en los años 0 y 9999, o simplemente estás utilizando estos como valores "positivos" infinito "infinito negativo" y? ¿Cómo es exactamente lo que se ve que el calendario es un calendario Juliano?

He intentado esto:

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);

Salida (en Windows XP, utilizando 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

Se cambia el año 0 al año 1. Cambiar el código para utilizar un segundo objeto de calendario para la segunda fecha:

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);

Esto no cambia nada a la salida o el contenido de los dos objetos Date.

Nota: Tenga en cuenta que literales enteros que empiezan con un 0, como 0000 en su código, serán interpretados como números octales por el compilador de Java. Eso no importa en este caso porque el número es 0, pero no se debe anteponer literales enteros con ceros si no se refiere a ellos como números octales.

Otros consejos

No hubo calendario gregoriano hasta 1582. El calendario Juliano estaba en uso en toda Europa, hasta que los problemas menores comenzaron a aparecer causada por el hecho de año solar no es exactamente 365,25 días, pero un poco menos que eso. Con el fin de arreglar las cosas, el papa Gregorio XIII ordenó a cambiar el calendario a lo que conocemos hoy en día - todos los años que divide por 100 no es un año bisiesto, a menos que se divide por 400. En octubre de 1582 fue la transición - el día después de 4 OCT, fue 15 Oct. Esto significa que hasta octubre de 1582, el gregoriano y Julian calendarios son el mismo. Puede leer más sobre él aquí

Esta es la razón por fechas anteriores a octubre de 1,582 se convierten a utilizar el sistema de Julian. De acuerdo con la API Si realmente necesita para representar un evento histórico (que no parece el caso aquí) que sólo puede hacerlo desde el 1 de marzo de 4AD

thhere hay año 0 en el calendario Juliano. Se va de 1 aC al 1 dC.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top