Gregorian Calendar anterior a 1930

11 respostas
L

Como posso ler corretamente uma data anterior a 1930 com Gregorian calendar ou outra classe? :frowning:
Exemplo : 06/05/1900 fica 11/06/2036.
Alguém já resolveu isto de alguma forma?

11 Respostas

caiofilipini

Tente usar:

GregorianCalendar calendario = new GregorianCalendar();

calendario.set(Calendar.YEAR, 1900);
calendario.set(Calendar.MONTH, Calendar.MAY);
calendario.set(Calendar.DAY_OF_MONTH, 5);

Valeu!

L

Agradeço a boa vontade, mas isto define uma data fixa com este ano.
No meu caso, estou lendo datas em uma tabela e entre várias datas lidas, algumas são anteriores a 1930. Estas datas são nascimentos e tenho faixa etária de 1900 a 2003. Preciso ler esta data corretamente da tabela e calcular quantos anos a pessoa tem. O cálculo eu sei como fazer veja rotina abaixo, porém quando o ano é inferior a 1930, a data retorna incorreta.

private double CalculaIdade(String dtnas) {

if (dtnas.equals(("")))
return (0);

GregorianCalendar datahoje = new GregorianCalendar();

double dif = myUtil.getDiffYear(myUtil.getCalendar(dtnas), datahoje);

return (dif);

}

cv1

O codigo que esta com problema é o getDiffYear, luiz… posta o codigo desse metodo que fica mais facil :slight_smile:

L

Cara, o problema é um pouco pior que eu pensava. Verifiquei que quando leio a data na tabela, ela já vem errada. Creio que o problema está no drive SQL. Estou usando o freetds_jdbc.jar e acredito que ele é que converte errado quando atribuo a variável lendo o recordset. Exemplo: String nascimento = rs0.getString(1);
Nesta hora , a variável nascimento já vem errada. antes mesmo de transformá-la para Gregorian Calendar. Conheces outro drive free? Ou será que estou errado quando ao drive ser o culpado?

cv1

Pq ao inves de chamar getString vc nao usa getDate ou getTimestamp? Com certeza resolve :wink:

L

Sem chances. Tentei getString, getDate, getTimestamp e nenhum deles retornou a data correta. Verifiquei que só acontece com datas anteriores a 1910 e não 1930 como havia dito. Mas infelizmente, o problema continua. Aguardo novas dicas. Obrigado.

louds

Nem todo banco suporta colunas datas com amplitude muito grande.
Principalmente se voce usar um campo timestamp, que normalmente é implementado como a diferença de tempo com o epoc (1970).

om1

Se for MS SQL, verifique pelo Query Analyser se o valor não está errado no banco, e pegue o driver JDBC para o SQL Server no site da microsoft. Este driver não é cobrado como um produto separado. Se vc tem licença do SQL Server, vc pode usá-lo sem problemas, e se vc não têm… o que é um peido pra quem tá todo cagado? :wink:

L

Agradeço, mas minha versão licenciada do SQL é 6.5 e o Drive não roda nesta versão. Foi a primeira coisa que tentei, antes mesmo de pegar o freetds. Estou “caçando” outros drivers para teste.

om1

Vc verificou pelo Query Analyser?
se a data estiver correta no banco, vc pode adicionar a funcao CONVERT do T-SQL na sua consulta SQL e retornar o valor como String(com getString). Se o valor ainda assim vier errado, não dá pra culpar o driver, porque a funcao CONVERT roda no SQL Server.
exemplo: “SELECT CONVERT(char,nome_do_campo_data,103) as ‘data’ from tabela”
retorna data como string no formato DD/MM/YYYY

L

Deu certo. Muito obrigado.

Criado 7 de julho de 2003
Ultima resposta 8 de jul. de 2003
Respostas 11
Participantes 5