PDA

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



mgupload
سه شنبه 08 تیر 1395, 13:26 عصر
سلام

من قصد دارم تاریخ میلادی امروز (2016/6/28) قمری تبدیل کنم

از قطعه کدی همانند شکل زیر استفاده کردم


nowDateTime = DateTime.Now;
label9.Text = hc.GetYear(nowDateTime) + "/" + hc.GetMonth(nowDateTime) + "/" + hc.GetDayOfMonth(nowDateTime);


مشکلی که وجود دارد این است که، مقدار بدست آمده (تاریخ قمری) یک روز جلوتر از تقویم هایی است که در دست داریم (به چاپ رسیده) در واقع تاریخ بدست آمده 1437/9/23 شده که این مقدار میبایست 1437/9/22 می شد!

تاریخ میلادی سیستم درست تنظیم شده است!

این مشکل چگونه قابل حل است؟

چگونه می توانم زمان بدست آمده را یک روز به عقب بیاورم؟

mrprestige
سه شنبه 08 تیر 1395, 21:20 عصر
سلام دوست من شما از تابع PersianCalendar برای تاریخ شمسی استفاده کردی ؟! باید به این صورت بنویسی

PersianCalendar pc = new PersianCalendar();
Label1.Text = (pc.GetYear(DateTime.Now) + " / " + pc.GetMonth(DateTime.Now) + " / " + pc.GetDayOfMonth(DateTime.Now).ToString());

پیروز و موفق باشی
از کدنویسی لذت ببری .

mgupload
چهارشنبه 09 تیر 1395, 04:40 صبح
سلام دوست من شما از تابع PersianCalendar برای تاریخ شمسی استفاده کردی ؟! باید به این صورت بنویسی

PersianCalendar pc = new PersianCalendar();
Label1.Text = (pc.GetYear(DateTime.Now) + " / " + pc.GetMonth(DateTime.Now) + " / " + pc.GetDayOfMonth(DateTime.Now).ToString());

پیروز و موفق باشی
از کدنویسی لذت ببری .

دوست گرامی این کدی که گفتید برای تبدیل کد میلادی به شمسی است! من میخواهم میلادی را به قمری تبدیل کنم!!

قطعه کد اینجانب


nowDateTime = DateTime.Now;
HijriCalendar hc = new HijriCalendar();
label9.Text = hc.GetYear(nowDateTime) + "/" + hc.GetMonth(nowDateTime) + "/" + hc.GetDayOfMonth(nowDateTime);


ولی این کد درست عمل نمیکند

- یک مثال :
در تاریخ میلادی 2016/6/28 : تاریخ قمری بدست آمده 1437/9/23 است! ولی مقدار درست میبایست 1437/9/22 می شد! (یک روز جلوتر است! به علت آنکه ماه قبل 30 روزه بوده که 29 روزه حساب شده و این اختلاف بدست آمده است) درواقع با تقویم هایی که ما داریم (به چاپ رسیده) کاملا متفاوت است!

جهت رفع این مشکل به نظرتون چیکار کنم؟

سایت هایی همچون یک ابزار تبدیل تاریخ درستی انجام میده! (لینک آن را در زیر قرار میدم) چطوری میتونم بفهمم الگوریتمی که استفاده کرده چطوری هست!؟

http://www.1abzar.com/abzar/convert-date.php

veniz2008
چهارشنبه 09 تیر 1395, 11:01 صبح
سلام.
مایکروسافت برای حل این مشکل یک پراپرتی از جنس int به نام HijriAdjustment در نظر گرفته که عددی بین 2- تا 2+ رو قبول می کنه. برای حل مشکلتون با توجه به تعداد روزهایی که اختلاف وجود داره عدد مناسب رو ست کنید.

System.Globalization.HijriCalendar hijri = new System.Globalization.HijriCalendar();
hijri.HijriAdjustment = -1;
اگه میخواید برنامه دست مشتری بدید، این قابلیت رو براش بذارید که خود کاربر بتونه برای سال های بعد، میزان اختلاف رو وارد کنه تا همیشه تقویم صحیحی رو داشته باشید.
موفق باشید.

mgupload
چهارشنبه 09 تیر 1395, 18:59 عصر
سلام.
مایکروسافت برای حل این مشکل یک پراپرتی از جنس int به نام HijriAdjustment در نظر گرفته که عددی بین 2- تا 2+ رو قبول می کنه. برای حل مشکلتون با توجه به تعداد روزهایی که اختلاف وجود داره عدد مناسب رو ست کنید.

System.Globalization.HijriCalendar hijri = new System.Globalization.HijriCalendar();
hijri.HijriAdjustment = -1;
اگه میخواید برنامه دست مشتری بدید، این قابلیت رو براش بذارید که خود کاربر بتونه برای سال های بعد، میزان اختلاف رو وارد کنه تا همیشه تقویم صحیحی رو داشته باشید.
موفق باشید.

نتیجه بهتر شد ولی هنوز با 30 ام ماه قمری مشکل دارد! درواقع هنوز آن ماه مورد نظر که 30 روزه است 29 روزه نشان داده می شود!

mrprestige
چهارشنبه 09 تیر 1395, 20:21 عصر
دوست گرامی این کدی که گفتید برای تبدیل کد میلادی به شمسی است! من میخواهم میلادی را به قمری تبدیل کنم!!


- یک مثال :
در تاریخ میلادی 2016/6/28 : تاریخ قمری بدست آمده 1437/9/23 است! ولی مقدار درست میبایست 1437/9/22 می شد! (یک روز جلوتر است! به علت آنکه ماه قبل 30 روزه بوده که 29 روزه حساب شده و این اختلاف بدست آمده است) درواقع با تقویم هایی که ما داریم (به چاپ رسیده) کاملا متفاوت است!

جهت رفع این مشکل به نظرتون چیکار کنم؟


سلام دوست من پوزش میخوام جواب سوالتون متوجه نشدم و با عجله جواب اشتباه بهتون دادم نمیدونم چرا فکر کردم شما تاریخ شمسی رو میخواستید ، جواب سوال شما به این صورت هست که براتون نوشتم و نکته ای که لازم میدونم بگم دیگه شما لازم نیست یه عدد به تاریخ اضافه کنید یا از اون کم کنید و 30ام ماه رو هم نمایش میده

DateTime U = DateTime.UtcNow;
Calendar cal = new HijriCalendar();
int y = cal.GetYear(U);
int m = cal.GetMonth(U);
int d = cal.GetDayOfMonth(U);
textBox4.Text = y + " \\" + m + "\\" + d;
اگه سوالی بود من درخدمتم .

پیروز و موفق باشید

mgupload
پنج شنبه 10 تیر 1395, 07:06 صبح
سلام دوست من پوزش میخوام جواب سوالتون متوجه نشدم و با عجله جواب اشتباه بهتون دادم نمیدونم چرا فکر کردم شما تاریخ شمسی رو میخواستید ، جواب سوال شما به این صورت هست که براتون نوشتم و نکته ای که لازم میدونم بگم دیگه شما لازم نیست یه عدد به تاریخ اضافه کنید یا از اون کم کنید و 30ام ماه رو هم نمایش میده

DateTime U = DateTime.UtcNow;
Calendar cal = new HijriCalendar();
int y = cal.GetYear(U);
int m = cal.GetMonth(U);
int d = cal.GetDayOfMonth(U);
textBox4.Text = y + " \\" + m + "\\" + d;
اگه سوالی بود من درخدمتم .

پیروز و موفق باشید

خیلی ممنون ... ولی نتیجه تغییری نکرد امروز 24 ام رمضان هست ولی 25 نشون میده!

veniz2008
جمعه 11 تیر 1395, 11:54 صبح
نتیجه بهتر شد ولی هنوز با 30 ام ماه قمری مشکل دارد! درواقع هنوز آن ماه مورد نظر که 30 روزه است 29 روزه نشان داده می شود!
احتمالا منظورتون با 30 ام ماه های محرم و صفر هست!. این دو ماه، در تقویم عربی پشت سر هم هستن. اما توضیح بیشتر اینکه :
توی تقویمی که دست ما هست (تقویم های کاغذی) بخاطر اینکه شهادت امام رضا در تاریخ 30 صفر بوده و در اکثر سال ها، ماه صفر 30 روزه نیست (چند سال متوالی رو از همون آدرس هایی که خودتون قرار داده بودید بررسی کنید تا متوجه منظورم بشید) کاری که انجام میدن اینه که از آخر ماه محرم کم می کنن و به ماه صفر اضافه می کنن تا همیشه تاریخ 30 صفر در تقویم وجود داشته باشه.
اون کدی که براتون گذاشتم درسته، تفاوتی که می بینید بخاطر نکته ای هست که در بالا گفتم.
موفق باشید.