Pergunta

Tentei definir o valor da data como PreparedStatement com valor padrão, mas às vezes o valor é retornado como JulianValue.Por exemplo (suponha que spanBegin e spanEnd sejam nulos)

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

Na linha número 3, como a data 1º de janeiro de 0000 tem como escopo um calendário juliano, o CDate se torna um calendário juliano.Porém, a próxima data, mesmo que seja no ano 9999, seu CDate ainda se torna um calendário juliano.Tive que criar outra instância do Calendário Gregoriano para corrigir o 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();
}

A questão é: isso é um comportamento esperado ou um bug no objeto de data?Na verdade, usar GregorianCalendar.getInstance() mostra que cdate às vezes é definido como JulianCalendar.

Foi útil?

Solução

Qual versão do Java você está usando e em qual sistema operacional? Você realmente precisa armazenar datas nos anos 0 e 9999, ou você está apenas usando -as como valores de "infinito negativo" e "infinito positivo"? Como exatamente você vê que o calendário é um calendário juliano?

Eu tentei o seguinte:

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

Saída (no Windows XP, usando 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

Ele muda o ano 0 para o ano 1. Alterando o código para usar um segundo objeto de calendário para a segunda data:

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

Isso não muda nada para a saída ou o conteúdo dos dois Date objetos.

Nota: Cuidado com os literais inteiros que começam com 0, como 0000 No seu código, será interpretado como números octal pelo compilador Java. Isso não importa neste caso, porque o número é 0, mas você não deve prender os literais inteiros com zeros se não os quiser como números octal.

Outras dicas

Não houve calendário gregoriano até 1582.O calendário Juliano estava em uso em toda a Europa, até que começaram a aparecer pequenos problemas causados ​​pelo facto do ano solar não ter exactamente 365,25 dias, mas um pouco menos que isso.Para consertar as coisas, o Papa Gregório XIII ordenou a mudança do calendário para o que conhecemos hoje – todo ano dividido por 100 não é um ano bissexto, a menos que seja dividido por 400.Em outubro de 1582 houve a transição - o dia seguinte a 4 de outubro foi 15 de outubro.Isto significa que até outubro de 1582, os calendários Gregoriano e Juliano são os mesmos.Você pode ler mais sobre isso aqui

É por isso que as datas anteriores a outubro de 1582 são convertidas para usar o sistema juliano.De acordo com API Se você realmente precisa representar um evento histórico (o que parece não ser o caso aqui), você pode fazê-lo somente a partir de 1º de março de 4AD

O número de não há ano 0 no calendário de Julian. Vai de 1 aC a 1 anúncio.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top