مشکل سال های کبیسه در جاوا
سلام
با اومدن سال جدید تاریخ های بعضی برنامه ها و دستگاه ها به هم ریخته و سوژه بسیاری از کانال ها شده .
تقریبا چند سال پیش بود ، روی یه سفارش اندرویدی کار میکردم که توش از تقویم فارسی استفاده باید میکردم .
بنا به عادت پیگیر لایبراری هایی برای این کار شدم , تو همون سرچ اول چندتا لایبراری با دیزاین های قشنگ پیدا کردم و تصمیم بر استفادشون گرفتم .
در نگاه اول همه چیز اوکی بود تا اینکه توی بعضی دیوایس ها به مشکل دیزاین برخوردم و بعضی جاها ui تقویم به هم میریخت با عوض کردن چند تا لایبراری و بررسیشون فهمیدم هر کدوم مشکلاتی دارن یکی ui رو بهم میریزه یکی دیزاینش شیک نیست و نمیشه شخصی سازی کرد به راحتی و..... این مسائل رو سخت نگرفتم تا اینکه به یه مشکل اساسی خوردم . "سال های کبیسه" متوجه شدم چندتا تقویمی که استفاده کردم تو چندتا سال خاص مشکل کبیسه گیری دارن .
پیش خودم گفتم این که کاری نداره کبیسه هر چهارسال یبار هستش و فوقش با یه حلقه شمارش سالها رو انجام میدم و.....
وقتی این کار رو کردم دیدم ای دل غافل همچیز در هم شد و سال ها بسی قاطی گشت (کبیسه های من با تقویم واقعی اصلا جور نبود 🙁
رفتم پیگیر کلاس های نوشته شده برا جاوا شدم که دیدم یه کلاس تقریبا خوب هست برا این کار (دنبال لینک سایتی که ازش دانلود کرده بودم گشتم پیدا نکردم ولی کلاس ویرایش شده خودمو آخر همین مطلب میزارم )
تبدیل ها رو خوب انجام میداد ولی باز با بعضی سال ها مشکل داشت مثلا ۱۳۴۲ ,۱۳۷۵ , ۱۴۰۳و ...... نمیتونست کبیسه رو درست تشخیص بده :

یکم تحقیق کردم که توی ویکی پدیا به جواب رسیدم
سال کبیسه - ویکیپدیا، دانشنامهٔ آزاد (wikipedia.org)
گاهشماری رسمی ایران - ویکیپدیا، دانشنامهٔ آزاد(wikipedia.org)
برخلاف تصور من کبیسه هر چهارسال یبار نیست و توی دوره هایی کبیسه پنج ساله داریم و بر خلاف تقویم میلادی کبیسه های ما دوره چندان منظمی در نگاه اول نداشت ; تو تقویم میلادی بعد از ۲۰ سال کبیسه ۴ ساله یه کبیسه ۵ ساله پیش میاد ولی در تقویم شمسی این دوره ها متفاوتن ۳۷ , ۳۳ ,۲۹ ساله که تکرار هر کدوم متفاوته .

نشستم به زیر و بالا کردن سال های استثنایی که توی اون مقاله ویکی پدیا و سال های استثنایی که خودم بدست اوردم رو تو یه کد اوردم و اون کلاس رو ارتقا دادم تا بتونم استفاده کنم (منبع چک من time.ir بود باحساب هم مشکلاتی داشت ) .
بهش یه ساختار برای نمایش در انتخابگر تاریخ (date packer) دادم تا تاریخ ۱۶۰۰ و بعد از اون تو برنامه هام چه ویندوزی و چه اندرویدی ازش استفاده میکنم .
راستی دوستان این مشکل من در زبان java بود.
کلاس و لینک گیت رو پایین میزارم تا هر کی خواست استفاده کنه یا هم اگر مشکلی در کد ها بود اصلاح کنه و ارتقا بده .
saudparkook/PersianDataPicker (github.com)
سلام
خیلی ممنون از مطلب مفیدتون بسیار کاربردی بود برام دقیقا به همین مشکل برخورده بودم و با عدد های عجیبی رو به رو شده بودم
سلام خوشحالم که مطلبم مورد پسند قرار گرفت.
خیلی عالی و کاربردی بود
ممنونم خوشحالم که مفید بود
سلام
دقت شما بسیار عالی بود.
من بعد از مقاله شما سایت time.ir و باحساب که معرفی کردید رو تست کردم ظاهرا الان سایت باحساب درست بود و اسفند سال ۱۳۴۲ رو ۳۰ روز نشون داد. عکسی که در مطلب قرار دادید ظاهرا الان تغییر کرده. گفتم اطلاع بدم که مقاله خوبتون دچار اشکال نباشه.
ممنون از این مقاله برای کمک به جامعه برنامه نویسان ایران
ممنونم از توجه شما
سلام و درود ضمن تشکر از شما لطفا در نظر داشته باشید فاصله کبیسه های خورشیدی ۴ و برخی موارد ۵ سال است و فاصله دو کبیسه ۵ ساله بیشتر اوقات ۳۳ سال و بعضا ۲۹ و خیلی کم ۳۷ سال است. در میلادی فاصله دو کبیسه ۴ و برخی موارد ۸ سال است مثلا ۱۸۹۲ و ۱۸۹۶ و بعد ۱۹۰۴ کبیسه هستند و ۱۹۰۰ کبیسه نیست