کلاس کار با تاریخ


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


public class PersianDate {
private int irYear; // Year part of a Iranian date
private int irMonth; // Month part of a Iranian date
private int irDay; // Day part of a Iranian date
private int gYear; // Year part of a Gregorian date
private int gMonth; // Month part of a Gregorian date
private int gDay; // Day part of a Gregorian date
private int juYear; // Year part of a Julian date
private int juMonth; // Month part of a Julian date
private int juDay; // Day part of a Julian date
private int leap; // Number of years since the last leap year (0 to 4)
private int JDN; // Julian Day Number
private int march; // The march day of Farvardin the first (First day of jaYear)


public PersianDate(){
Calendar calendar = new GregorianCalendar();
setGregorianDate(calendar.get(Calendar.YEAR),
calendar.get(Calendar.MONTH)+1,
calendar.get(Calendar.DAY_OF_MONTH));
}

public PersianDate(int year, int month, int day){
setGregorianDate(year,month,day);
}


public int getIranianYear() {
return irYear;
}

public int getIranianMonth() {
return irMonth;
}

public int getIranianDay() {
return irDay;
}

public int getGregorianYear() {
return gYear;
}

public int getGregorianMonth() {
return gMonth;
}


public int getGregorianDay() {
return gDay;
}

public int getJulianYear() {
return juYear;
}

public int getJulianMonth() {
return juMonth;
}

public int getJulianDay() {
return juDay;
}

public String getIranianDate(){
String Year,Month,Day;

Year = String.valueOf(irYear).substring(2, 4);

if(irMonth < 10){
Month = "0"+String.valueOf(irMonth);

}else{
Month = String.valueOf(irMonth);
}

if(irDay < 10){
Day = "0"+String.valueOf(irDay);

}else{
Day = String.valueOf(irDay);
}

return (Year+""+Month+""+Day);
}

public String getGregorianDate(){
return (gYear+"/"+gMonth+"/"+gDay);
}

public String getJulianDate(){
return (juYear+"/"+juMonth+"/"+juDay);
}

public String getWeekDayStr(){
String weekDayStr[]={
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
"Sunday"};
return (weekDayStr[getDayOfWeek()]);
}

public String toString(){
return (getWeekDayStr()+", Gregorian:["+getGregorianDate()+"], Julian:["+getJulianDate()+"], Iranian:["+getIranianDate()+"]");
}

public int getDayOfWeek(){
return (JDN % 7);
}

public void nextDay(){
JDN++;
JDNToIranian();
JDNToJulian();
JDNToGregorian();
}

public void nextDay(int days){
JDN+=days;
JDNToIranian();
JDNToJulian();
JDNToGregorian();
}

public void previousDay(){
JDN--;
JDNToIranian();
JDNToJulian();
JDNToGregorian();
}

public void previousDay(int days){
JDN-=days;
JDNToIranian();
JDNToJulian();
JDNToGregorian();
}

public void setIranianDate(int year, int month, int day){
irYear =year;
irMonth = month;
irDay = day;
JDN = IranianDateToJDN();
JDNToIranian();
JDNToJulian();
JDNToGregorian();
}

public void setGregorianDate(int year, int month, int day){
gYear = year;
gMonth = month;
gDay = day;
JDN = gregorianDateToJDN(year,month,day);
JDNToIranian();
JDNToJulian();
JDNToGregorian();
}

public void setJulianDate(int year, int month, int day){
juYear = year;
juMonth = month;
juDay = day;
JDN = julianDateToJDN(year,month,day);
JDNToIranian();
JDNToJulian();
JDNToGregorian();
}

private void IranianCalendar(){
// Iranian years starting the 33-year rule
int Breaks[]={-61, 9, 38, 199, 426, 686, 756, 818,1111,1181,1210,1635,2060,2097,2192,2262,2324,2 394,2456,3178} ;
int jm,N,leapJ,leapG,jp,j,jump;
gYear = irYear + 621;
leapJ = -14;
jp = Breaks[0];
// Find the limiting years for the Iranian year 'irYear'
j=1;
do{
jm=Breaks[j];
jump = jm-jp;
if (irYear >= jm){
leapJ += (jump / 33 * 8 + (jump % 33) / 4);
jp = jm;
}
j++;
} while ((j<20) && (irYear >= jm));
N = irYear - jp;
// Find the number of leap years from AD 621 to the begining of the current
// Iranian year in the Iranian (Jalali) calendar
leapJ += (N/33 * 8 + ((N % 33) +3)/4);
if ( ((jump % 33) == 4 ) && ((jump-N)==4))
leapJ++;
// And the same in the Gregorian date of Farvardin the first
leapG = gYear/4 - ((gYear /100 + 1) * 3 / 4) - 150;
march = 20 + leapJ - leapG;
// Find how many years have passed since the last leap year
if ( (jump - N) < 6 )
N = N - jump + ((jump + 4)/33 * 33);
leap = (((N+1) % 33)-1) % 4;
if (leap == -1)
leap = 4;
}

public boolean IsLeap(int irYear1){
// Iranian years starting the 33-year rule
int Breaks[]=
{-61, 9, 38, 199, 426, 686, 756, 818,1111,1181,
1210,1635,2060,2097,2192,2262,2324,2394,2456,3178} ;
int jm,N,leapJ,leapG,jp,j,jump;
gYear = irYear1 + 621;
leapJ = -14;
jp = Breaks[0];
// Find the limiting years for the Iranian year 'irYear'
j=1;
do{
jm=Breaks[j];
jump = jm-jp;
if (irYear1 >= jm){
leapJ += (jump / 33 * 8 + (jump % 33) / 4);
jp = jm;
}
j++;
} while ((j<20) && (irYear1 >= jm));
N = irYear1 - jp;
// Find the number of leap years from AD 621 to the begining of the current
// Iranian year in the Iranian (Jalali) calendar
leapJ += (N/33 * 8 + ((N % 33) +3)/4);
if ( ((jump % 33) == 4 ) && ((jump-N)==4))
leapJ++;
// And the same in the Gregorian date of Farvardin the first
leapG = gYear/4 - ((gYear /100 + 1) * 3 / 4) - 150;
march = 20 + leapJ - leapG;
// Find how many years have passed since the last leap year
if ( (jump - N) < 6 )
N = N - jump + ((jump + 4)/33 * 33);
leap = (((N+1) % 33)-1) % 4;
if (leap == -1)
leap = 4;
if (leap==4 || leap==0)
return true;
else
return false;

}

public int IranianDateToJDN(){
IranianCalendar();
return (gregorianDateToJDN(gYear,3,march)+ (irMonth-1) * 31 - irMonth/7 * (irMonth-7) + irDay -1);
}

private void JDNToIranian(){
JDNToGregorian();
irYear = gYear - 621;
IranianCalendar(); // This invocation will update 'leap' and 'march'
int JDN1F = gregorianDateToJDN(gYear,3,march);
int k = JDN - JDN1F;
if (k >= 0){
if (k <= 185){
irMonth = 1 + k/31;
irDay = (k % 31) + 1;
return;
}else
k -= 186;
}else{
irYear--;
k += 179;
if (leap == 1)
k++;
}
irMonth = 7 + k/30;
irDay = (k % 30) + 1;
}

private int julianDateToJDN(int year, int month, int day){
return (year + (month - 8) / 6 + 100100) * 1461/4 + (153 * ((month+9) % 12) + 2)/5 + day - 34840408;
}

private void JDNToJulian(){
int j= 4 * JDN + 139361631;
int i= ((j % 1461)/4) * 5 + 308;
juDay = (i % 153) / 5 + 1;
juMonth = ((i/153) % 12) + 1;
juYear = j/1461 - 100100 + (8-juMonth)/6;
}

private int gregorianDateToJDN(int year, int month, int day){
int jdn = (year + (month - 8) / 6 + 100100) * 1461/4 + (153 * ((month+9) % 12) + 2)/5 + day - 34840408;
jdn = jdn - (year + 100100+(month-8)/6)/100*3/4+752;
return (jdn);
}

private void JDNToGregorian(){
int j= 4 * JDN + 139361631;
j = j + (((((4* JDN +183187720)/146097)*3)/4)*4-3908);
int i= ((j % 1461)/4) * 5 + 308;
gDay = (i % 153) / 5 + 1;
gMonth = ((i/153) % 12) + 1;
gYear = j/1461 - 100100 + (8-gMonth)/6;
}


}