Datas em JAVA

PHP, Java, JavaScript, XML, XHTML, HTML, CSS, ASP, Delphi, Assembly, LaTeX, C, UML, Flash, Perl, SQL, Python, Zope, Pascal, WML. Se conhece mais de 3 siglas referidas, este é o forum para si.

Moderadores: Administradores, Moderadores

Datas em JAVA

Mensagempor 20030542 » Sexta Jun 01, 2007 11:05

Bom dia pessoal !

tenho o seguinte codigo

public class Xpto2 extends Xpto {
Date dataInicio;
Date dataFim;
public int custoXpto(){
int nrDias=dataFim-dataInicio;
return nrDias;
}
}

o meu objectivo é retirar a diferença de dias que tenho de uma data para outra, mas não dá. Já tentei com cast do tipo:
int nrDias=(int)dataFim-dataInicio;
mas continua a dizer que não dá porque não há hipotese de fazer o cast de uma data para um int.

alguém tem alguma ideia para me poder ajudar?

obrigado desde já

Cumprimentos
Avatar do Utilizador
20030542
Membro de Prata
Membro de Prata
 
Mensagens: 101
Registado: Quarta Abr 18, 2007 19:32
Localização: SAC

Mensagempor Cr@sh_Ov3rride » Sexta Jun 01, 2007 11:56

class Data {
private int ano; // qualquer ano
private int mes; // 1-12
private int dia; // 1-31 dependente do mês

// private String diaDaSemana; // nome do dia da semana
private static int [] diasPorMes = {0,31,28,31,30,31,30,31,31,30,31,30,31};

private static String [] nomeDiaSemana = {"Segunda-feira", "Terca-feira", "Quarta-feira","Quinta-feira", "Sexta-feira", "Sabado", "Domingo"};

private static String [] nomeMes = { "Invalido", "Janeiro", "Fevereiro", Marco", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro","Outubro", Novembro", "Dezembro"};

// Construtor: Confirma o valor do mes e chama o metodo validaDia para confirmar o valor do dia.
public Data( int a, int m, int d ) {
ano = a; // tambem poderia validar
if ( m > 0 && m <= 12 ) mes = m; // valida o mês
else {
mes = 1;
System.out.println( "Mes "+ m +" invalido. Colocado o mes 1.");
}
dia = validaDia( d ); // valida o dia
diaDaSemana = detDiaDaSemana();
}

// Confirma o valor do dia baseado no mes e ano.
private int validaDia( int d ) {
if ( d > 0 && d <= diasPorMes[ mes ] ) return d;
// se Fevereiro e dia 29 verifica se é ano bissexto
if ( mes == 2 && d == 29 && anoBissexto(ano) ) return d;
System.out.println( "Dia " + d + " invalido. Colocado o dia 1." );
return 1; // Deixa o objecto num estado consistente
}

private static boolean anoBissexto(int a) { //Ano bissexto.
return ( a % 400 == 0 || a % 4 == 0 && a % 100 != 0 ) ;
}

private int diasDoAno() { // Número de dias desde 1 de Jan.
int n=0;
for (int i=1; i<=mes-1; ++i) n = n + diasPorMes[i];
if (mes > 2 && anoBissexto(ano)) ++n;
return dia-1+n;
}

private int diaDaSemana1Jan() {
// Referência: 1/1/1 = Segunda-feira (0)
// um ano não bissexto avança um dia: 365%7=1
// um ano bissexto avança 2 dias: 366%7=2
int d = 0;
for (int a=1; a<ano; ++a) d += anoBissexto(a)?2:1;
return d%7;
}

private String detDiaDaSemana() {
int n = diaDaSemana1Jan() + diasDoAno();
return nomeDiaSemana[n%7];
}

// Cria uma String da forma dia/mes/ano
public String toString() {
return diaDaSemana + ", " + dia + "/" + mes + "/" + ano;
}

public boolean maisRecente(Data d) {
if ( ano > d.ano ) return true;
if ( ano == d.ano ) {
if ( mes > d.mes ) return true;
if ( mes == d.mes )
if ( dia > d.dia ) return true;
}
return false;
}

public long diferencaEmDias(Data d) {
if ( maior(d) ) return difDias(d);
return d.difDias(this);
}

private long difDias(Data d) {
if (ano == d.ano) return diasDoAno() - d.diasDoAno();
// Numero de dias até ao fim do ano da menor das datas
long dias = 365 + (anoBissexto(d.ano)?1:0) - d.diasDoAno();
// Diferença de anos em dias
for (int a=d.ano+1; a<ano; ++a)
dias += 365 + (anoBissexto(a)?1:0) ;
// Numero de dias desde 1 Jan. até à maior das datas
return dias + diasDoAno();
}

public static Data lerData() throws java.io.IOException {
int a = Util.lerNumero("Ano = ");
int m = Util.lerNumero("Mes = ");
int d = Util.lerNumero("Dia = ");
return new Data(a, m, d);
}
}


Tens aqui uma ceninha muito fixe... É extenso mas tens tudo...

Boa programação! :wink:
Imagem
Imagem
Imagem
Cr@sh_Ov3rride
Membro de Prata
Membro de Prata
 
Mensagens: 438
Registado: Domingo Jan 23, 2005 11:08
Localização: @everywhere

Mensagempor 20030542 » Sexta Jun 01, 2007 22:44

Obrigado

vou tentar :)
Avatar do Utilizador
20030542
Membro de Prata
Membro de Prata
 
Mensagens: 101
Registado: Quarta Abr 18, 2007 19:32
Localização: SAC

Mensagempor FullMetal » Segunda Jun 11, 2007 1:20

tenta antes usar a class calendar

import java.util.Calendar;
import java.util.GregorianCalendar;

....

int dia = 1;
int mes =1;
Calendar c = new GregorianCalendar();

int y = c.get(Calendar.YEAR);
int m = c.get(Calendar.MONTH);
int d = c.get(Calendar.DAY_OF_MONTH);

String data_inicial = y+"-"+(m+1)+"-"+d;

c.add(Calendar.DAY_OF_MONTH,dias);
c.add(Calendar.MONTH,meses);

int y2 = c.get(Calendar.YEAR);
int m2 = c.get(Calendar.MONTH);
int d2 = c.get(Calendar.DAY_OF_MONTH);

String data_final=y2+"-"+ (m2+1) +"-"+d2;


System.out.println("Ini: " + data_inicial);
System.out.println("Fin: " + data_final);

....

tão aqui mais funções são muito úteis, assim não precisas de criar a roda outra vez :)
http://java.sun.com/j2se/1.4.2/docs/api/java/util/Calendar.html
http://java.sun.com/j2se/1.4.2/docs/api/java/util/GregorianCalendar.html
FullMetal
Novato
Novato
 
Mensagens: 1
Registado: Segunda Abr 04, 2005 18:32

Mensagempor 20030542 » Segunda Jun 11, 2007 10:17

obrigado :)
Avatar do Utilizador
20030542
Membro de Prata
Membro de Prata
 
Mensagens: 101
Registado: Quarta Abr 18, 2007 19:32
Localização: SAC


Voltar para Programação

Quem está ligado:

Utilizadores a ver este Fórum: Nenhum utilizador registado e 3 visitantes

cron