PDA

نسخه کامل مشاهده نسخه کامل : تبدیل تاریخ میلادی به هجری در سی شارپ



mohammad aghajani
15-05-2007, 22:10
می خواستم برنامه ای بنویسم مثل برنامه date and time در ویندوز ولی با این فرق که وقتی تاریخ میلادی را انتخاب می کنیم تاریخ هجری هم نمایش بدهد

ممنون می شم اگه کمک کنید

someone
16-05-2007, 01:39
سلام.
برای مجموعه Net. یه Library رایگان نوشته شده برای تبدیل تاریخها که میتونین از اون استفاده کنین.
از لینک زیر میتونین بگیرینش :
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

mohammad aghajani
19-05-2007, 01:46
من این برنامه را خودم نوشتم ولی یکسری مشکل داره اگه اشکالاتشو بر طرف کنید ممنون میشم



private void button1_Click(object sender, EventArgs e)
{
int yyy = DateTime.Now.Year;
int mmm = DateTime.Now.Month;
int ddd = DateTime.Now.Day;
label1.Text = Convert.ToString(yyy + "/" + mmm + "/" + ddd);
int y=DateTime .Now.Year ;
int m=DateTime .Now .Month ;
int d=DateTime .Now .Day;
int yy,mm,dd;
int[] a ={ 0, 10, 11, 9, 11, 10, 10, 9, 9, 9, 8, 9, 9 };
int[] b ={ 0, 30, 30, 29, 31, 31, 31, 31, 31, 31, 30, 30, 30 };
yy=y-621;
if ((y%4==0)&&(m==3)&&(d>=21))
{
a[3]++;
b[3]++;
}
if (dd > b[m])
{
dd -= b[m];
mm++;
lbl1.Text = Convert.ToString(yy + "/" + mm + "/" + dd);
}


if (m >= 4)
{
mm = m - 3;
dd = d + a[m];
lbl1.Text = Convert.ToString(yy + "/" + mm + "/" + dd);
}
else
{
yy = y - 622;
mm = m + 9;
dd = d + a[m];
lbl1.Text = Convert.ToString(yy + "/" + mm + "/" + dd);

}
}

اینم فرمم
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ] and Settings\user.SHAIFISP-55A847\My Documents\My Pictures\untitled2.bmp

_H2_
19-05-2007, 16:11
سلام
عجیب است که هنوز برنامه نویسات دات نت نمیدانند که کلاسس بومی System.Globalization.PersianCalendar برای تبدیلات هجری شمسی به صورت ذاتی در دات نت وجود دارد!!!!

mohammad aghajani
22-05-2007, 19:50
من برنامه را خودم نوشتم ودرست کار میکنه فقط اشکالی که داره وقتی به روز29اسفند می رسه به بعد به جای اینکه اول فروردین را نشان دهد می نویسد1/13/1386هر کار کردم درست نشد و این اشکال تا پایان ماه march ادامه دارد ولی از اول ماه April درست می شود




کد برنامه اینه:




private void button1_Click(object sender, EventArgs e)
{
int yy= DateTime.Now.Year;
int mm = DateTime.Now.Month;
int dd = DateTime.Now.Day;
int year = DateTime.Now.Year;
int month = DateTime.Now.Month;
int day = DateTime.Now.Day;
int y, m, d;
int[] A ={ 0, 10, 11, 9, 11, 10, 10, 9, 9, 9, 8, 9, 9 };
int[] B ={ 0, 30, 30, 29, 31, 31, 31, 31, 31, 31, 30, 30, 30 };
y = year - 621;
if ((year % 4 == 0) && (month == 3) && (day >= 21))
{
A[3]++;
B[3]++;
}
if (month >= 4)
m = month - 3;
else
m = month + 9;
d = day + A[month];
if (d > B[month])
{
d -= B[month];
m++;
}

if ((m == 10) || (m == 11) || (m == 12))
y--;
shamsi.Text = Convert.ToString(y + "/" + m + "/" + d);
miladi.Text = Convert.ToString(yy + "/" + dd + "/" + mm);
}
}
}



ممنون می شم جواب بدید







در ضمن منم میدونم که در دات نت همچین امکاناتی وجود داره ولی می خواستم خودم برنامه اش را بنویسم.

_H2_
23-05-2007, 10:01
سلام
خیلی خیلی خیلی خیلی خیلی به توان 0/1 میبخشید!!!! ولی کد شما ارزش ندارد!!!!! چاکریم!
تضمین میدهم که با روش فوق اگر هم درست کار کند هیچ اعتباری برای درست کار کردن آن در سال بعد نیست، باید کبیسه های 4 ساله و 5 ساله به شدت لحاظ شوند که حتی در کدهای به ظاهر کاملی که من دیدم هیچ یک کبیسه های پنج سال را لحاظ نکرده بودند و برنامه شان بدون شک برای بعد سال سال ؟140 درست جواب نمیدهد و نیز قبل از 1370 یا حتی 1375 .

الگوریتم صحیح تبدیل اصلاً اینطوری نیست، باید جور دیگری فکر کنید! آنگاه قضیه خیلی راحت و دقیق میشود!
اگر میخواهید باید الگوریتم شما بر مبنای تعداد روز گذشته از مبدا باشد.


یعنی تاریخ شمسی را تبدیل کنید به تعداد کل روزهای گذشته شده از اول هجرت!!!!
زیاد هم سخت نیست برابر است با :
تعداد روزهای گذشته شده از اول همان سال + تعداد سالهای قبل * 365 + تعداد سالهای قبلی کبیسه 4 ساله + تعداد سالهای قبلی کبیسه 5 ساله (1)
بعد هم مشخص است مقدار شمسی را به علاوه اختلاف تعداد روزهای میلادی شمسی میکنید (که با یک کالیبراسیون به راحتی بدست میآید) و به همین راحتی تعداد روزهای گذشته از اول میلاد حضرت مسیح را بدست می آوردید. (2)
خود دات نت در ذات تاریخ را به صورت تعداد 100 نانو ثانیه گذشته از اول میلاد نگه میدارد، در نتیجه جمع و تفریق تاریخ ها هم بدوم توجه به تعداد ثانیه در دقیقه ... روز و هزار جفنگیات دیگه ! به راحتی و سرعت تفریق و جمع دو عدد صحیح انجام میشود، و بعد در زمان نمایش تاریخ سریعاً این عدد را بع روز و ماه و سال و... تبدیل کرده و نشان میدهد.
در نتیجه عددی را که در مرحله (2) بدست آورید در 10000000 * 60 * 60* 24 ضرب میکنید و حاصل تاریخ میلادی است!

برای برعکی هم به همین ترتیب اول عدد ticks های تاریخ میلادی را بر 10000000 * 60 * 60 * 24 تقسیم میکنید تا به تعداد روز برسید و آن را از اختلاف تعداد روز میلادی و شمسسی کم میکنید تا به تعداد روز از اول هجرت برسید و آنگاه برعکس معادله (1) را انجام میدهید.



به این سختی ها که به نظر میرسد نیست! دقیق و راحت است و با این اوصاف جمع و تفریق دو تاریخ هم واقعاً بچه گانه و سریع و البته دقیق میشود.