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!
