PDA

View Full Version : یه باگ در کلاس PersianCalendar میگید چیکار کنم...



kablayi
شنبه 31 مرداد 1388, 09:28 صبح
سلام....
با این کلاس به یه مشکل برخوردم اونم اینه که:
با یه حساب سر انگشتی ساده میشه فهمید که سال 1407 کبیسه است ولی وقتی که میخوام تاریخ 30/12/1407 رو به میلادی تبدیل کنم ایراد میگیره و میگه روز باید بین 1 تا 29 باشه در صورتی که سال 1407 کبیسه است و این تاریخ درسته...
جالب اینجاست که تا سال 1403 درست جواب میده اما از سال 1407 به بعد دیگه کبیسه ها رو اشتباه میکنه ...
یعنی 1411 و 1415 و 1419 و الی آخر رو اشتباه میکنه....!!!!
از اون طرف هم از سال 1371 به قبل یعنی 1367 و 1363 و ... رو اشتباه میکنه ...!!!!
حالا میگید چیکار کنم....؟؟؟؟؟؟


Dim Sh AsNew System.Globalization.PersianCalendar
TextBox1.Text = Sh.ToDateTime(1407, 12, 30, 0, 0, 0, 0, 0)

Hossis
شنبه 31 مرداد 1388, 11:16 صبح
از راه های دیگر تبدیل تاریخ استفاده کن

sari-1369
شنبه 31 مرداد 1388, 11:22 صبح
من شنیده بودم ، هر چند سال یه مورد استثنا پیش میاد که بجای هر 4 سال ، هر 3 سال کبیسه میشه . ( نمیدونم تا چه حد درسته )

شما سال 1406 رو آزمایش کن

Hossis
شنبه 31 مرداد 1388, 11:28 صبح
من شنیده بودم ، هر چند سال یه مورد استثنا پیش میاد که بجای هر 4 سال ، هر 3 سال کبیسه میشه . ( نمیدونم تا چه حد درسته )

شما سال 1406 رو آزمایش کن

منظورت 1406 میلادیه یا شمسی؟؟

sari-1369
شنبه 31 مرداد 1388, 11:45 صبح
شمسی .

kablayi
شنبه 31 مرداد 1388, 13:04 عصر
تاریخ شمسی دقیق ترین تاریخه...
هر 4 سال یه بار سال کبیسه است...
نمیشه که بگم بعد از فرضا 15 سال از این به بعد سه سال یه بار کبیسه بگیره که؟؟؟؟
میشه یه تابع تبدیل تاریخ شمسی به میلادی بنویسم ولی میخواستم بدونم راه حل دیگه ای داره یا نه ...؟

anooshiran
شنبه 31 مرداد 1388, 13:17 عصر
سلام دوست عزيز
كامپوننتي را كه من براي اين منظور درست كردم نيز تست كن. فكر مي كنم اين مشكل را نداشته باشه . آدرس آن هم در زير امضاء من هست. اگر استفاده كردي نتيجه را بگو. ممنونم ميشم

sari-1369
شنبه 31 مرداد 1388, 17:29 عصر
تاریخ شمسی دقیق ترین تاریخه...
هر 4 سال یه بار سال کبیسه است...
نمیشه که بگم بعد از فرضا 15 سال از این به بعد سه سال یه بار کبیسه بگیره که؟؟؟؟


در اینکه تقویم شمسی دقیق ترینه شک نیس.

فرضا هر 10,000 سال 1 بار 3 سال کبیسه میشه و دوباره 4 سال 4 سال کبیسه میشه تا 10,000 سال بعدی .

( گفتم مطمعن نیستم ، ولی منظورم اینی بود که بالا گفتم )

anooshiran
یک شنبه 01 شهریور 1388, 02:26 صبح
سلام دوستان
در بالا توضيحي داده بودم كه نياز به تصحيح آن مي بينم.

محاسبه سال كبيسه شمسي:

برای تشخیص این‌که سال شمسي مورد نظر کبیسه است یا خیر، کافی است که باقی‌ماندهٔ تقسیم سال شمسي را بر عدد ۳۳ بدست آوریم. اگر باقی‌مانده یکی از اعداد( ۱، ۵، ۹، ۱۳، ۱۷، ۲۲، ۲۶ و ۳۰ )باشد، سال شمسي سال کبیسه است.به عنوان مثال سال ۱۳70 را در نظر بگيرید. باقی‌ماندهٔ تقسیم ۱۳70 بر عدد ۳۳ برابر 17 است بنابراین سال ۱۳70، سال کبیسه است.تقريبا در هر 33 سال 8 سال كبيسه و 25 سال معمولي قرار دارد. علت تقسيم بر 33 هم همين مقوله است. بنابراين يكي از سالهاي كبيسه پنج ساله ميشود كه ميتوان آن را شروع دوره 33 ساله جديد در نظر گرفت.

حال مشكل دوست عزيز آقاي kablayi اين است كه سال 1407 را كبيسه مي انگارد (كه البته بنده هم همينطور فكر مي كردم و همانند ايشان فكر مي كردم كه اين مسئله ناشي از يك باگ است.ولي زود قضاوت كردم و مانند هميشه قضاوت سريع نتيجه قابل قبولي برايم در بر نداشت). در صورتيكه باقي مانده تقسيم 1407 بر 33 عدد 21 است كه در مجموعه اعداد فوق نمي گنجد ولي سال 1408 سال كبيسه است زيرا مانده تقسيم 1408 بر 33 عدد 22 است.يعني سال 1403 كبيسه است و بعد از آن يك دوره كبيسه 5 ساله خواهيم داشت . (اين دوره از سال 1370 شروع گرديده و به سال 1403 ختم مي گردد يعني 33 سال . بنابراين سال كبيسه قبل از 1370 سال 1366 و سال كبيسه بعدي نيز سال 1375بوده است.سال 1371 سال كبيسه نيست.)

سال 1403 را ميتوان سال پايان دوره 33 ساله قبلي و شروع دوره 33 ساله جديد دانست كه كبيسه بعدي آن 5 ساله خواهد بود و به سال 1436 ختم خواهد شد.

محاسبه سال كبيسه ميلادي

برای تشخیص این که سال میلادی مورد نظر کبیسه است، حداقل یکی از شرایط زیر باید برقرار باشد:

۱) سال میلادی مورد نظر بر ۴ بخش‌پذیر باشد (باقی‌ماندهٔ تقسیم آن سال بر ۴ برابر ۰ باشد) و بر ۱۰۰ بخش‌پذیر نباشد (باقی‌ماندهٔ تقسیم آن بر ۱۰۰ برابر ۰ نباشد)

۲) سال میلادی مورد نظر بر ۴۰۰ بخش‌پذیر باشد

به عنوان مثال سال ۱۹۰۰ میلادی با این که بر ۴ بخش‌پذیر است سال کبیسه نیست (چون بر ۱۰۰ بخش‌پذیر است). سال ۲۰۰۰ میلادی سال کبیسه است (چون بر ۴۰۰ بخش‌پذیر است). سال ۲۰۰۴ میلادی سال کبیسه است (چون بر ۴ بخش‌پذیر است و بر ۱۰۰ بخش‌پذیر نیست).


براي توضيحات بيشتر به لينك زير مراجعه كنيد

http://msdn.microsoft.com/en-us/library/system.globalization.persiancalendar.aspx

در ضمن براي مقايسه تطبيقي سالها نيز مي توانيد به سايت زير مراجعه كنيد

http://www.world-news.org/persian/Calendar.aspx?Date=19970320

مجددا بابت توضيحات ناقص قبلي خود از دوستان پوزش مي طلبم.

kablayi
یک شنبه 01 شهریور 1388, 03:43 صبح
سلام...
خیلی عجیبه ...:اشتباه:
من تاحالا فکر میکردم هر چهار سال یه بار سال کبیسه به وجود میاد اما اینطور که معلومه anooshiran درست میگن...
من تا حالا از اون روش تقسیم بر 4 استفاده میکردم ولی اینطور که معلومه اشتباه بوده...

ممنون

sari-1369
یک شنبه 01 شهریور 1388, 12:40 عصر
دیدین حق با من بود :لبخند: