PDA

View Full Version : مبدل تاریخ میلادی به شمسی:



ناصرقلی
شنبه 29 شهریور 1382, 07:15 صبح
یه مبدل تاریخ میلادی به شمسی برای جاوا کارها!

شنبه 29 شهریور 1382, 10:12 صبح
ببخشید! من سورس رو ضمیمه کردم ولی مثل اینکه ضمیمه رو نشون نمیده! پس این هم خود سورس:
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Calendar;
/**
* This class contains some static methods for converting gregorian dates to
* persian date
* @author Nasser Sadeqi (nasser_sadeqi@yahoo.com)
*/

public class PersianCal{
private static double len = 365.24219879;
private static double base = 2346;

private static double greg_len = 365.2425;
private static double greg_origin_from_jalali_base = 629964;
private static String greg_month_names[]={"","Jan","Feb","Mar","Apr","May","June","Jul","Aug","Sep","Oct","Nov","Dec"};

//-------------------------------------------------------------------
/** Converts specified gregorian date to persian date in form of (yyyy/mm/dd) */
public static String getPersianDate(int gregYear,int gregMonth,int gregDay){
// passed days from Greg orig
double d = Math.ceil((gregYear-1)*greg_len);
// passed days from jalali base
double d_j = d + greg_origin_from_jalali_base + getGregDayOfYear(gregYear,gregMonth,gregDay);

//first result! jalali year
double j_y = Math.ceil(d_j/len)-2346;
// day of the year
double j_days_of_year = Math.floor(((d_j/len) - Math.floor(d_j/len))*365)+1;


System.out.println(j_days_of_year);
StringBuffer result = new StringBuffer();

result.append((int)j_y+"/"+(int)month(j_days_of_year)+"/"+(int)dayOfMonth(j_days_of_year));
return result.toString();
}

/** Converts specified gregorian date to persian date in form of (yyyy/mm/dd) */
public static String getPersianDate(Date d){
GregorianCalendar gc = new GregorianCalendar();
gc.setTime(d);
int year = gc.get(Calendar.YEAR);
return getPersianDate(year,(gc.get(Calendar.MONTH))+1,gc. get(Calendar.DAY_OF_MONTH));
}

/** Returns persian year according to specified gregorian date. */
public static int getPersianYear(Date dt){
GregorianCalendar gc = new GregorianCalendar();
gc.setTime(dt);
int gregYear = gc.get(Calendar.YEAR);
int gregMonth = gc.get(Calendar.MONTH)+1;
int gregDay = gc.get(Calendar.DAY_OF_MONTH);

double d = Math.ceil((gregYear-1)*greg_len);
double d_j = d + greg_origin_from_jalali_base + getGregDayOfYear(gregYear,gregMonth,gregDay);
double j_y = Math.ceil(d_j/len)-2346;
double j_days_of_year = Math.floor(((d_j/len) - Math.floor(d_j/len))*365);
return (int)j_y;
}

/** returns the persian month number according to specified gregorian date (Months:1..12) */
public static int getPersianMonth(Date dt){
GregorianCalendar gc = new GregorianCalendar();
gc.setTime(dt);
int gregYear = gc.get(Calendar.YEAR);
int gregMonth = gc.get(Calendar.MONTH)+1;
int gregDay = gc.get(Calendar.DAY_OF_MONTH);

double d = Math.ceil((gregYear-1)*greg_len);
double d_j = d + greg_origin_from_jalali_base + getGregDayOfYear(gregYear,gregMonth,gregDay);
double j_y = Math.ceil(d_j/len)-2346;
double j_days_of_year = Math.floor(((d_j/len) - Math.floor(d_j/len))*365);
return (int)month(j_days_of_year);
}

/** Returns day number (1..31) */
public static int getPersianDayOfMonth(Date dt){
GregorianCalendar gc = new GregorianCalendar();
gc.setTime(dt);
int gregYear = gc.get(Calendar.YEAR);
int gregMonth = gc.get(Calendar.MONTH)+1;
int gregDay = gc.get(Calendar.DAY_OF_MONTH);

double d = Math.ceil((gregYear-1)*greg_len);
double d_j = d + greg_origin_from_jalali_base + getGregDayOfYear(gregYear,gregMonth,gregDay);
double j_y = Math.ceil(d_j/len)-2346;
double j_days_of_year = Math.floor(((d_j/len) - Math.floor(d_j/len))*365);
return (int)dayOfMonth(j_days_of_year);
}


//******************************
private static double month(double day){

if(day<=6*31)
return Math.ceil(day/31);
else
return Math.ceil((day-6*31)/30)+6;
}

private static double dayOfMonth(double day){

double m = month(day);
if(m<=6)
return day - 31*(m-1);
else
return day-(6*31)-(m-7)*30;
}

private static double getGregDayOfYear(double year,double month,double day){
int greg_moneths_len[] = {0,31,28,31, 30,31,30, 31,31,30 ,31,30,31};
boolean leap=false;
if(((year%4)==0)&&(((year%400)!=0)))leap = true;
if(leap)greg_moneths_len[2]=29;
int sum=0;
for(int i=0;i<month;i++)
sum+=greg_moneths_len[i];
return sum+day-2;
}

//**********
}

shaniaki
شنبه 29 شهریور 1382, 10:33 صبح
با عرض ادب:
بسیار جالب و مفید.
دستت درد نکنه.
فقط جالب تر بود اگر موقع تایپ وسط تگ code می گذاشتیش.

یه عشق برنامه نویسی خفن

ناصرقلی
شنبه 29 شهریور 1382, 11:23 صبح
سلام
تگ رو گذاشتم قبول نکرد.
راستی مثل اینکه داونلود برای اعضا کار میکنه!

mansoor
جمعه 02 آبان 1382, 05:36 صبح
:D
i dont know java at all
but it's god
i can't type parsia :oops: n.

jeus
سه شنبه 07 خرداد 1387, 12:02 عصر
لطف کنه یکی از دوستان کلاس compile شدشو اینجا قرار بده
با تشکر

saeed_Z_F
چهارشنبه 08 خرداد 1387, 13:29 عصر
سلام
این کد مشکل داره 4 روز عقبتر معدل شمسی رو میده .
اگه فایل جاوا رو upload کنید بهتره .

mazdadoost
چهارشنبه 08 خرداد 1387, 17:25 عصر
دوستان بد نیست سری به این تاپیک بزنید.
http://barnamenevis.org/forum/showthread.php?t=104621