PDA

View Full Version : تاریخ شمسی



rosenth
پنج شنبه 30 اردیبهشت 1389, 07:02 صبح
کسی تابع تاریخ شمسی برای Qt رو احیانا داره؟

rosenth
پنج شنبه 30 اردیبهشت 1389, 08:36 صبح
header file:


#ifndef JALALI_H
#define JALALI_H
#include <QString>
class jalaliDate
{
private:


public:
void gregorian_to_jalali(/* output */ int *j_y, int *j_m, int *j_d,
/* input */ int g_y, int g_m, int g_d)

{
int g_days_in_month[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int j_days_in_month[12] = {31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29};

int gy, gm, gd;
int jy, jm, jd;
long g_day_no, j_day_no;
int j_np;

int i;

gy = g_y-1600;
gm = g_m-1;
gd = g_d-1;

g_day_no = 365*gy+(gy+3)/4-(gy+99)/100+(gy+399)/400;
for (i=0;i<gm;++i)
g_day_no += g_days_in_month[i];
if (gm>1 && ((gy%4==0 && gy%100!=0) || (gy%400==0)))
/* leap and after Feb */
++g_day_no;
g_day_no += gd;

j_day_no = g_day_no-79;

j_np = j_day_no / 12053;
j_day_no %= 12053;

jy = 979+33*j_np+4*(j_day_no/1461);
j_day_no %= 1461;

if (j_day_no >= 366) {
jy += (j_day_no-1)/365;
j_day_no = (j_day_no-1)%365;
}

for (i = 0; (i < 11) && (j_day_no >= j_days_in_month[i]); ++i) {
j_day_no -= j_days_in_month[i];
}
jm = i+1;
jd = j_day_no+1;
*j_y = jy;
*j_m = jm;
*j_d = jd;
}
void jalali_to_gregorian(/* output */ int *g_y, int *g_m, int *g_d,
/* input */ int j_y, int j_m, int j_d){
int g_days_in_month[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int j_days_in_month[12] = {31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29};

int gy, gm, gd;
int jy, jm, jd;
long g_day_no, j_day_no;
int leap;

int i;

jy = j_y-979;
jm = j_m-1;
jd = j_d-1;

j_day_no = 365*jy + (jy/33)*8 + (jy%33+3)/4;
for (i=0; i < jm; ++i)
j_day_no += j_days_in_month[i];

j_day_no += jd;

g_day_no = j_day_no+79;

gy = 1600 + 400*(g_day_no/146097); /* 146097 = 365*400 + 400/4 - 400/100 + 400/400 */
g_day_no = g_day_no % 146097;

leap = 1;
if (g_day_no >= 36525) /* 36525 = 365*100 + 100/4 */
{
g_day_no--;
gy += 100*(g_day_no/36524); /* 36524 = 365*100 + 100/4 - 100/100 */
g_day_no = g_day_no % 36524;

if (g_day_no >= 365)
g_day_no++;
else
leap = 0;
}

gy += 4*(g_day_no/1461); /* 1461 = 365*4 + 4/4 */
g_day_no %= 1461;

if (g_day_no >= 366) {
leap = 0;

g_day_no--;
gy += g_day_no/365;
g_day_no = g_day_no % 365;
}

for (i = 0; g_day_no >= g_days_in_month[i] + (i == 1 && leap); i++)
g_day_no -= g_days_in_month[i] + (i == 1 && leap);
gm = i+1;
gd = g_day_no+1;

*g_y = gy;
*g_m = gm;
*g_d = gd;
}
};

#endif // JALALI_H



use in MainApplication:


int y, m, d;
QDate grigorianDate;date=QDate::currentDate(); // gregorian date
jalaliDate currentDate;
currentDate.gregorian_to_jalali(&y,&m,&d,grigorianDate.year(),grigorianDate.month(),grigo rianDate.day());
QString today=QString("%1/%2/%3").arg(y).arg(m).arg(d);
if(m<10) today.insert(5,"0");
if(d<10) today.insert(8,"0");