بروز خطا
[message]
اشتراک در سوال
رای ها
[dataList]
نحوه گرفتن تاریخ شمسی و تبدیل آن به میلادی
خیلی پیش اومده که شما میخواستین تاریخ شمسی رو در اپلیکیشن خودتون بگیرین ولی dataPicker تاریخ میلادی بوده !
راه حلی رو میخام معرفی کنم امیدوارم خوشتون بیاد و رای بدید :))
اولا که این کتابخونه رو باید روش زیر اضافه کنید :
به فایل Build.gradle رفته از نوع Top level و خط زیر را به بخش repositories اضافه کنید.
mavenCentral()
برای این کار وارد فایل Build.gradle شده از نوع module و خط زیر را در بخش dependencies قرار دهید :
compile 'com.mohamadamin:persianmaterialdatetimepicker:1.2.1'
حالا خطوط زیر رو مطابق نیاز خودتون میتونید تغییر بدید :
final PersianCalendar persianCalendar = new PersianCalendar();
com.mohamadamin.persianmaterialdatetimepicker.date.DatePickerDialog.OnDateSetListener listener =
new com.mohamadamin.persianmaterialdatetimepicker.date.DatePickerDialog.OnDateSetListener () {
@Override
public void onDateSet(com.mohamadamin.persianmaterialdatetimepicker.date.DatePickerDialog view, int year, int month, int dayOfMonth) {
ConvertTopersian jCal = new ConvertTopersian(); // یک نمونه از تقویم بساز
jCal.PersianToGregorian(year, month+1, dayOfMonth); // این کتابخونه رو هم در ادامه توشیح میدم برای تبدیل شمسی به میلادیه
txtInput.setText("تاریخ شمسی :" + "\n" + year + "/" + month + "/" + dayOfMonth );
txtOutput.setText("تاریخ میلادی معادل :" + "\n" + jCal.getYear() + "/" + jCal.getMonth() + "/" + jCal.getDay());
}
};
com.mohamadamin.persianmaterialdatetimepicker.date.DatePickerDialog datePickerDialog =
new com.mohamadamin.persianmaterialdatetimepicker.date.DatePickerDialog().newInstance(listener,
persianCalendar.getPersianYear(),
persianCalendar.getPersianMonth(),
persianCalendar.getPersianDay() );
datePickerDialog.setThemeDark(true);
datePickerDialog.show(getFragmentManager(), "tpd");
}
برای این که theme برنامه به درستی کارکنه باید کد زیر را به Colors.xml اضافه کنید :
<color name="mdtp_accent_color_dark">#00796b</color>
<color name="mdtp_accent_color">#009688</color>
اما برای این که بتونید شمسی رو به میلادی و برعکس تبدیل کنید از کلاس زیر استفاده کنید :
public class ConvertTopersian {
private int day, month, year;
private int jY, jM, jD;
private int gY, gM, gD;
private int leap, march;
/**
* Calculates the Julian Day number (JG2JD) from Gregorian or Julian
* calendar dates. This integer number corresponds to the noon of the date
* (i.e. 12 hours of Universal Time). The procedure was tested to be good
* since 1 March, -100100 (of both the calendars) up to a few millions
* (10**6) years into the future. The algorithm is based on D.A. Hatcher,
* Q.Jl.R.Astron.Soc. 25(1984), 53-55 slightly modified by me (K.M.
* Borkowski, Post.Astron. 25(1987), 275-279).
*
* @param year
* <code>int</code>
* @param month
* <code>int</code>
* @param day
* <code>int</code>
* @param J1G0
* to be set to 1 for Julian and to 0 for Gregorian calendar
* @return Julian Day number
*/
private int JG2JD(int year, int month, int day, int J1G0) {
int jd = (1461 * (year + 4800 + (month - 14) / 12)) / 4
+ (367 * (month - 2 - 12 * ((month - 14) / 12))) / 12
- (3 * ((year + 4900 + (month - 14) / 12) / 100)) / 4 + day
- 32075;
if (J1G0 == 0)
jd = jd - (year + 100100 + (month - 8) / 6) / 100 * 3 / 4 + 752;
return jd;
}
/**
* Calculates Gregorian and Julian calendar dates from the Julian Day number
* (JD) for the period since JD=-34839655 (i.e. the year -100100 of both the
* calendars) to some millions (10**6) years ahead of the present. The
* algorithm is based on D.A. Hatcher, Q.Jl.R.Astron.Soc. 25(1984), 53-55
* slightly modified by me (K.M. Borkowski, Post.Astron. 25(1987), 275-279).
*
* @param JD
* Julian day number as <code>int</code>
* @param J1G0
* to be set to 1 for Julian and to 0 for Gregorian calendar
*/
private void JD2JG(int JD, int J1G0) {
int i, j;
j = 4 * JD + 139361631;
if (J1G0 == 0) {
j = j + (4 * JD + 183187720) / 146097 * 3 / 4 * 4 - 3908;
}
i = (j % 1461) / 4 * 5 + 308;
gD = (i % 153) / 5 + 1;
gM = ((i / 153) % 12) + 1;
gY = j / 1461 - 100100 + (8 - gM) / 6;
}
/**
* Converts the Julian Day number to a date in the Jalali calendar
*
* @param JDN
* the Julian Day number
*/
private void JD2Jal(int JDN) {
JD2JG(JDN, 0);
jY = gY - 621;
JalCal(jY);
int JDN1F = JG2JD(gY, 3, march, 0);
int k = JDN - JDN1F;
if (k >= 0) {
if (k <= 185) {
jM = 1 + k / 31;
jD = (k % 31) + 1;
return;
} else {
k = k - 186;
}
} else {
jY = jY - 1;
k = k + 179;
if (leap == 1)
k = k + 1;
}
jM = 7 + k / 30;
jD = (k % 30) + 1;
}
/**
* Converts a date of the Jalali calendar to the Julian Day Number
*
* @param jY
* Jalali year as <code>int</code>
* @param jM
* Jalali month as <code>int</code>
//* @param Jd
* Jalali day as <code>int</code>
* @return Julian day number
*/
private int Jal2JD(int jY, int jM, int jD) {
JalCal(jY);
int jd = JG2JD(gY, 3, march, 1) + (jM - 1) * 31 - jM / 7 * (jM - 7)
+ jD - 1;
return jd;
}
/**
* This procedure determines if the Jalali (Persian) year is leap (366-day
* long) or is the common year (365 days), and finds the day in March
* (Gregorian calendar) of the first day of the Jalali year (jY)
*
* @param jY
* Jalali calendar year (-61 to 3177)
*/
private void JalCal(int jY) {
march = 0;
leap = 0;
int[] breaks = { -61, 9, 38, 199, 426, 686, 756, 818, 1111, 1181, 1210,
1635, 2060, 2097, 2192, 2262, 2324, 2394, 2456, 3178 };
gY = jY + 621;
int leapJ = -14;
int jp = breaks[0];
int jump = 0;
for (int j = 1; j <= 19; j++) {
int jm = breaks[j];
jump = jm - jp;
if (jY < jm) {
int N = jY - jp;
leapJ = leapJ + N / 33 * 8 + (N % 33 + 3) / 4;
if ((jump % 33) == 4 && (jump - N) == 4)
leapJ = leapJ + 1;
int leapG = (gY / 4) - (gY / 100 + 1) * 3 / 4 - 150;
march = 20 + leapJ - leapG;
if ((jump - N) < 6)
N = N - jump + (jump + 4) / 33 * 33;
leap = ((((N + 1) % 33) - 1) % 4);
if (leap == -1)
leap = 4;
break;
}
leapJ = leapJ + jump / 33 * 8 + (jump % 33) / 4;
jp = jm;
}
}
/**
* Modified <code>toString()</code> method that represents date string
*
* @return Date as <code>String</code>
*/
@Override
public String toString() {
return String.format("%04d-%02d-%02d", getYear(), getMonth(), getDay());
}
/**
* Converts Gregorian date to Persian(Jalali) date
*
* @param year
* <code>int</code>
* @param month
* <code>int</code>
* @param day
* <code>int</code>
*/
public void GregorianToPersian(int year, int month, int day) {
int jd = JG2JD(year, month, day, 0);
JD2Jal(jd);
this.year = jY;
this.month = jM;
this.day = jD;
}
/**
* Converts Persian(Jalali) date to Gregorian date
*
* @param year
* <code>int</code>
* @param month
* <code>int</code>
* @param day
* <code>int</code>
*/
public void PersianToGregorian(int year, int month, int day) {
int jd = Jal2JD(year, month, day);
JD2JG(jd, 0);
this.year = gY;
this.month = gM;
this.day = gD;
}
/**
* Get manipulated day
*
* @return Day as <code>int</code>
*/
public int getDay() {
return day;
}
/**
* Get manipulated month
*
* @return Month as <code>int</code>
*/
public int getMonth() {
return month;
}
/**
* Get manipulated year
*
* @return Year as <code>int</code>
*/
public int getYear() {
return year;
}
}
نحوه استفاده از این کلاسم که معلومه و من هم بالا نوشتم نمونه مثالشو :)
رای فراموش نشه
یا علی
یا علی
برای این سوال پاسخی وجود ندارد.
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .