précédent | suivant | table des matières
public class Date {
private final int[]nbJours=
{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
private int jour, mois, annee;
public Date(int jour, int mois, int annee) throws Exception{
this.jour = jour;
this.mois = mois;
this.annee = annee;
verifierValidite();
}
public boolean estBissextile(){
return (annee%4==0 && annee%100!=0) || annee%400==0;
}
public boolean equals(Object o){
if( o instanceof Date){
Date d = (Date) o;
return jour == d.jour&& mois == d.mois && annee == d.annee;
}else return false;
}
/**
* Retourne un nombre négatif si la date this est avant o,
* un nombre positif si this est après o,
* et 0 si les deux dates sont égales.
* @param o doit être une date
* @return
* @exception ClassCastException si o n'est pas une date
**/
public int compareTo(Object o) {
Date d = (Date) o;
return jourJulien() - d.jourJulien();
}
private void verifierValidite()throws DateException{
if( mois<0 || mois>12)throw new DateException("mois illégal");
if( (mois == 2 && estBissextile() && jour>0 && jour<=29) ||
( jour>0 && jour<=nbJours[mois-1]));
else throw new DateException("jour de mois illégal");
}
public int jourJulien(){
// numérotation des jours à partir du lundi 1 janvier -4712 à 12 h
// (Joseph Juste Scaliger 1583)
// conversion à partir du calendrier grégorien
// algo de l´Institut de mécanique céleste et de calcul des éphémérides
int heures = 12;
int GGG = 1;
if( annee < 1582 ) GGG = 0;
if( annee <= 1582 && mois < 10 ) GGG = 0;
if( annee <= 1582 && mois == 10 && jour < 5 ) GGG = 0;
double JD = -1*Math.floor(7*(Math.floor((mois + 9)/12.)+ annee) / 4.);
int S = 1;
if ((mois - 9)<0) S=-1;
int A = Math.abs(mois - 9);
double J1 = Math.floor(annee + S * Math.floor(A / 7.));
J1 = -1 * Math.floor((Math.floor(J1 / 100) + 1) * 3 / 4.);
JD = JD + Math.floor(275 * mois / 9.) + jour + (GGG * J1);
JD = Math.floor(JD + 1721027 + 2 * GGG + 367 * annee - 0.5);
JD = JD + (heures / 24.);
if(JD<0) JD = 0;
return (int)Math.round(JD);
}
public String jourSemaine(){
int jj = jourJulien();
switch ((int)(jj+1.5)%7){
case 0 : return "dimanche"; case 1 : return "lundi";
case 2 : return "mardi"; case 3 : return "mercredi";
case 4 : return "jeudi"; case 5 : return "vendredi";
default: return "samedi";
}
}
public int getJour(){ return jour;}
public int getMois(){ return mois;}
public String getMoisChaine(){
switch(mois){
case 1 : return "janvier";
case 2 : return "février";
case 3 : return "mars";
case 4 : return "avril";
case 5 : return "mai";
case 6 : return "juin";
case 7 : return "juillet";
case 8 : return "août";
case 9 : return "septembre";
case 10 : return "octobre";
case 11 : return "novembre";
case 12 :
default :return"décembre";
}
}
public int getAnnee(){ return annee;}
public void jourSuivant(){
try{
++jour;
verifierValidite();
}catch(DateException ex){
try{
++mois;
jour = 1;
verifierValidite();
}catchDate(Exception ex1){
try{
++annee;
jour = 1;
mois = 1;
verifierValidite();
}catch(DateException ex2){}
}
}
}
public void jourPrecedent(){
try{
--jour;
verifierValidite();
}catch(DateException ex){
try{
--mois;
jour = nbJours[mois - 1];
if(estBissextile() && mois == 2)++jour;
verifierValidite();
}catch(DateException ex1){
try{
--annee;
jour = 31;
mois = 12;
verifierValidite();
}catch(DateException ex2){}
}
}
}
public int quantieme(){ // numéro du jour dans l'année
return !estBissextile()
? (int)(Math.round(275*mois/9-2*Math.round((mois+9)/12))+jour - 30)
: (int)(Math.round(275*mois/9-Math.round((mois+9)/12))+jour - 30) ;
}
public String toString(){
return d.jourSemaine() + " " + d.getJour() + " " +
d.getMoisChaine()+ " " + d.getAnnee() ;
}
}