persian-calendar / persian-calendar

Android Persian Calendar / تقویم فارسی اندروید
https://play.google.com/store/apps/details?id=com.byagowi.persiancalendar
GNU General Public License v3.0
725 stars 184 forks source link

بهبود و اصلاح تقویم قمری #53

Closed ab2lghaffar closed 5 years ago

ab2lghaffar commented 8 years ago

با توجه به اینکه ماه های قمری همیشه طبق تقویم از قبل تعیین شده پیش نمی رود و معمولا یک روز جلو و عقب نسبت به تقویم رسمی به وجود می آید، اگر امکانش باشد در تنظیمات تقویم امکان اصلاح آن تا یک یا دو روز به جلو و عقب قرار داده شود. این گزینه باعث می شود فارسی زبانانی که در کشورهای دیگری به جز ایران زندگی میکنند و ممکن است ماه قمری آن ها با ماه قمری تقویم ایران مطابقت نداشته باشد هم مفید باشد. با تشکر از تقویم خوبتان

hamidsafdari commented 8 years ago

موافقم. حرف خیلی خوبیه.

Arya766 commented 8 years ago

ایجاد گزینه‌ای برای تنظیم دستی برای یکی-دو روز قبل و بعد، تنها یک راه‌حل دم‌دستی و غیراصولی‌ست. بالاخره تقویم قمری هم، روش و فرمول محاسبه دارد. به نظر من، بهترین کار این است که کد سایت www.time.ir رو بررسی کنید، ببینید چه کرده‌اند که هم برای تمام شهرها محاسبه می‌کند، هم نیازی به تصحیح ندارد.

behdad222 commented 8 years ago

@Arya766 برای دیده شدن ماه که نمیشه فرمول مشخص کرد سایت مذکور هم دستی قطعا یا دستی عمل میکنه یا به جایی وصل میشه که دستی عمل کرده

Arya766 commented 8 years ago

@behdad222 اگر دقت‌تون هم به اندازه‌ی سرعت اظهارنظرتون بود: ۱. می‌خوندید صحبت من درباره‌ی «تقویم قمری» بود، نه «رؤیت هلال». شما رؤیت رو به آقایون فقها واگذار کنید، مثل تقویم‌های استخراجی دکتر ملک‌پور، در فکر محاسبه‌ی گردش ماه به دور زمین باشید، نه رؤیت! ۲. یه مراجعه به سایت مذکور می‌فرمودید و شخصا Inspect می‌کردید، تا به جای گفتن «حتما»، و اظهارنظر به حدس و گمان، با قطعیت درباره‌ی این که اونجا چه کرده اظهارنظر می‌فرمودید. ۳. برفرض سایت هم مثل شما با محاسبه بیگانه باشد، اصل عرض بنده، که قابل محاسبه بودن گردش ماه به دور زمین است، پابرجاست. با آرزوی دقت

ebraminio commented 8 years ago
@Arya766 گرامی بگذارید مشکل را در آرامش بیشتری حل کنیم. اول که بگویم من هم افزودن گزینه برای جلو عقب کردن را راه حل نمی‌دانم و به همین خاطر تا الآن از انجام آن پرهیز کرده‌ام و به مانند شما به راه‌حلی اصولی معتقدم. الگوریتم مبدل تاریخ این برنامه نیز از برنامه متن‌باز دیگری گرفته شده است و بنده شخصاً پیش‌زمینه و مطالعهٔ کافی در زمینه تبدیل تقویم‌ها را نداشته‌ام (و یک فلسفهٔ استفاده از کتابخانه‌ای متن‌باز همین است) با این پیش‌فرض که اگر در آن مشکل وجود داشت در آن پروژهٔ متن‌باز برطرف می‌شد که متأسفانه نشده است.

من این متن را داشتم می‌خواندم http://icu-project.org/apiref/icu4j/com/ibm/icu/util/IslamicCalendar.html که در آن به سه چهار نوع شیوهٔ محاسبه تقویم هجری اشاره شده http://icu-project.org/apiref/icu4j/com/ibm/icu/util/IslamicCalendar.CalculationType.html

اطلاع دارید کدام یک به آنی که در ایران استفاده می‌شود نزدیک‌تر است؟ توجه کنید که حتی بعضی از الگوریتم‌هایی که در آنجا به‌عنوان یک کتابخانه بین‌المللی‌سازی معتبر پیاده‌سازی شده آن طور که اشاره شده حتی دقیق نیستند پس به نظر شما همچنان عقب یا جلو بردن راه حل مناسبی نیست؟ با تشکر از توجه شایان تقدیر شما به این برنامه ☺
Arya766 commented 8 years ago

@ebraminio سلام، چشم، مخلص شمام هستیم. دقیقا همین‌طوره: من امکان تغییر دستی رو وصله پینه می‌دونم، نه راه‌حل. یه کتابی امیرکبیر چاپ می‌کرد به اسم «تحقیقی در زمینهٔ گاه‌شماری هجری و مسیحی»، تألیف دکتر رضا عبداللهی. نمی‌دونم هنوز چاپ میشه یا نه، ولی توضیحات دقیقی به همراه فرمول‌های محاسباتی، و روش‌های تبدیل رو، دقیق و واضح گفته. گروه اخترفیزیک یا ژئوفیزیک (یادم نیست کدوم) دانشگاه تهران هم، حداقل سالی یک بار، کارگاه محاسبه‌ی تقویم میذاره. امسال فکر می‌کنم هنوز برگزار نشده. این دو تا، به اضافه‌ی سایتی که عرض کردم، راه‌حل‌هاییه که به فکر من می‌رسه. ضمنا، کماکان از شما،‌ بابت تقویم‌تون قدردانم؛ کم‌حجم، متن باز، و حلال مشکلات. مرسی

hamidsafdari commented 8 years ago

سلام، همه این حرفها درست اما با اضافه کردن این گزینه به برنامه نه قانونی شکسته میشه نه به گروهی توهین.

کدوم یک خوبتره: دیدن اینکه تاریخ قمری یک روز عقب یا جلوست و منتظر بشینیم که کسی از راه برسه و این مشکل رو به طور اساسی از بیخ برطرف کنه یا فعلا همین گزینه نه چندان خوب رو داشته باشیم و به کاربر اجازه بدیم تاریخ قمری رو عقب و جلو بیندازه.

کسایی هم که به حرف آخوندها گوش میدن ببینن ماه نو شده یا نه احتمالا درصد بالایی از کاربران تقویم هستند. نمیشه در نظر گرفته نشوند.

ebraminio commented 8 years ago

بله شاید اصلاً تقصیر من باشد که باگ‌های تقاضای دقیق کردن تقویم را به این موضوع واگذار کردم و این دو را بهتر است به طور جداگانه بررسی کرد

به هر حال از دوستانی که اطلاع دارند تقاضا دارم بنا بر این قسمت از مستندات کتابخانهٔ آی‌سی‌یو ببینند به طور منطقی تقویم ما به کدام شیوه نزدیک‌تر است که اگر به این صورت ممکن نباشد احتمالاً باید با آزمایش صحیح‌خطا به نتیجه برسیم

از http://icu-project.org/apiref/icu4j/com/ibm/icu/util/IslamicCalendar.html

IslamicCalendar is a subclass of Calendar that that implements the Islamic civil and religious calendars. It is used as the civil calendar in most of the Arab world and the liturgical calendar of the Islamic faith worldwide. This calendar is also known as the "Hijri" calendar, since it starts at the time of Mohammed's emigration (or "hijra") to Medinah on Thursday, July 15, 622 AD (Julian). The Islamic calendar is strictly lunar, and thus an Islamic year of twelve lunar months does not correspond to the solar year used by most other calendar systems, including the Gregorian. An Islamic year is, on average, about 354 days long, so each successive Islamic year starts about 11 days earlier in the corresponding Gregorian year.

Each month of the calendar starts when the new moon's crescent is visible at sunset. However, in order to keep the time fields in this class synchronized with those of the other calendars and with local clock time, we treat days and months as beginning at midnight, roughly 6 hours after the corresponding sunset.

There are three main variants of the Islamic calendar in existence. The first is the civil calendar, which uses a fixed cycle of alternating 29- and 30-day months, with a leap day added to the last month of 11 out of every 30 years. This calendar is easily calculated and thus predictable in advance, so it is used as the civil calendar in a number of Arab countries. This is the default behavior of a newly-created IslamicCalendar object.

The Islamic religious calendar and Saudi Arabia's Umm al-Qura calendar, however, are based on the observation of the crescent moon. It is thus affected by the position at which the observations are made, seasonal variations in the time of sunset, the eccentricities of the moon's orbit, and even the weather at the observation site. This makes it impossible to calculate in advance, and it causes the start of a month in the religious calendar to differ from the civil calendar by up to three days.

Using astronomical calculations for the position of the sun and moon, the moon's illumination, and other factors, it is possible to determine the start of a lunar month with a fairly high degree of certainty. However, these calculations are extremely complicated and thus slow, so most algorithms, including the one used here, are only approximations of the true astronomical calculations. At present, the approximations used in this class are fairly simplistic; they will be improved in later versions of the code.

Like the Islamic religious calendar, Umm al-Qura is also based on the sighting method of the crescent moon but is standardized by Saudi Arabia.

The setCalculationType method determines which approach is used to determine the start of a month. By default, the fixed-cycle civil calendar is used. However, if setCalculationType(ISLAMIC) is called, an approximation of the true lunar calendar will be used. Similarly, if setCalculationType(ISLAMIC_UMALQURA) is called, an approximation of the Umm al-Qura lunar calendar will be used.

This class should not be subclassed.

IslamicCalendar usually should be instantiated using Calendar.getInstance(ULocale) passing in a ULocale with the tag "@calendar=islamic" or "@calendar=islamic-civil" or "@calendar=islamic-umalqura".

ebraminio commented 8 years ago

دو متن دیگر از مستندات سایر پیاده‌سازی‌های کتابخانه‌های مشهور نرم‌افزاری که احتمالاً جهت بررسی مفید هستند

از http://www.threeten.org/threetenbp/apidocs/org/threeten/bp/chrono/HijrahDate.html

The Hijrah calendar has a different total of days in a year than Gregorian calendar, and a month is based on the period of a complete revolution of the moon around the earth (as between successive new moons). The calendar cycles becomes longer and unstable, and sometimes a manual adjustment (for entering deviation) is necessary for correctness because of the complex algorithm

که ظاهراً در آن به گونه‌ای تصحیح دستی درست دانسته شده است

و http://joda-time.sourceforge.net/cal_islamic.html

The Islamic, or Hijri, calendar system is a Lunar calendar used in many Muslim countries. The Islamic calendar system is a lunar calendar based on observation. The observation aspect of the calendar means that a new month can only be declared based on human observations of the moon, something which can obviously vary and is unsuited to computer calculation. Joda-Time implements the arithmetic Islamic calendar, which is an approximation of the actual calendar. There are 12 months, each of 29 or 30 days, making a year of 354 days, or 355 in a leap year. The days in the month alternate, with the first month having 30 days, the second 29 days and so on. In a leap year, the twelfth month has 30 days instead of the normal 29. The definition of a leap year in the Islamic calendar varies. All agree on a 30 year cycle, however which years within the 30 are leap varies by the leap year pattern: 15-based 2, 5, 7, 10, 13, 15, 18, 21, 24, 26, 29 16-based 2, 5, 7, 10, 13, 16, 18, 21, 24, 26, 29 Indian 2, 5, 8, 10, 13, 16, 19, 21, 24, 27, 29 Habash al-Hasib 2, 5, 8, 11, 13, 16, 19, 21, 24, 27, 30 Joda-Time allows you to choose between these leap year patterns. The 16-based algorithm is the most commonly used, and is the default. Note that Microsoft uses the 15-based pattern, and calls it the 'Kuwaiti algorithm'. The epoch of the calendar system is 0622-07-16 (Julian) which is therefore 0001-01-01 (Islamic). The current (and only implemented) era is 'AH' (Anno Hegirae). Days of the week are named 'the first day', 'the second day' and so on, where Sunday is the first day. The day of the week value (numeric) returned by Joda-Time however, is the same as the ISO day of week definition. Thus Sunday will return the numeric value 7, and Monday will return the numeric value 1. A day in the Islamic calendar begins at sunset on the previous 'day'. Joda-Time does not model this, thus times and date rollover follow standard ISO definitions, in other words starting at midnight.

behdad222 commented 8 years ago

این ایشو با همون روش کثیف ۲ روز عقب یا جلو بردن انجام شد تعداد روزهای یک ماه رو کم یا زیاد نمیکنه شاید اگر یه مقدار باهوش‌تر شدم و وقت آزاد بیشتری داشتم بهتر بهش فکر کنم ایشو رو میزارم باز بمونه

ali-1989 commented 6 years ago

با سلام. لازمه یک توضیحی در مورد تقویم قمری داده بشه. تقویم قمری وابسته به گردش ماه به دور زمین می باشد برخلاف تقویم های شمسی که ربطی به ماه ندارند بلکه به گردش زمین به دور خورشید وابسته هستند. هر ماه قمری حد اقل 29 روز می باشد ممکن است در غروب روز 29 هلال ماه دیده شود در این صورت این ماه تمام شده و وارد ماه جدید می شویم و اگر هلال ماه در غروب روز 29 دیده نشود این ماه 30 روزه می شود. یک ماه قمری نمی تواند بیش از 30 روز باشد بنابراین اگر در غروب روز 29 ماه؛هلال ماه جدید دیده نشود حتما در روز بعد دیده می شود. البته ممکنه دیده نشه در این حالت ماه 31 روزه نمیشه بلکه در رویت هلال ماه قبل اشتباه شده یعنی روزی که فکر می کردیم 29 ماه است در اصل 28 ماه بوده همین طور ممکنه غروب 28 یک ماه ،هلال ماه جدید دیده بشه در این حالت باز ماه 28 روزه نیست بلکه در ابتدای ماه اشتباه شده چنا نچه حدود 15 سال پیش یک بار ماه مبارک رمضان 28 روز شد و معلوم شد ابتدا ی ماه اشتباه تشخیص داده شده یعنی روز اول ماه رمضان به اشتباه روز آخر ماه شعبان در نظر گرفته شده بود

خب بریم سر اصل مطلب ببینید برای تعیین روز اخر یک ماه قمری حتما باید هلال ماه جدید با چشم دیده بشه گرچه در علم فیزیک و نجوم محاسباتی برای تعیین ماه های قمری وجود دارد ولی تا امروز نشان داده که این محاسبات چندان منطبق با حالت رویت هلال ماه با چشم نیست

پس تا الان هیچ راهی برای تطبیق این دو روش وجود ندارد بنابراین تمامی نرم افزار هایی که دارای تقویم قمری می باشد قسمتی در برنامه قرار داده اند که می توان این اختلاف را به صورت دستی تنطیم کرد

در مورد سایت time.ir به احتمال زیاد این سایت قسمت مربوط به تقویم قمری را در صورت اختلاف پیدا کردن با رویت هلال ماه به صورت دستی تغییر می دهد

توضیحات کمکی را در لینک زیر می توانید ببینید https://fa.wikipedia.org/wiki/گاه‌شماری_هجری_قمری

firouzian commented 6 years ago

‫من پیشنهادم این است که برنامه را به صورت پلاگین در بیاوریم و اگر کسی تقویم شیعی خواست از آن ماژول استفاده کند و اگر اصلاً نیازی نداشت آن را خاموش کند. برای تصحیح شیعی هم از طریق API با ارتباط با یک مرجع انجام گیرد. من رفیقی دارم که از تقویم خیلی خوب سر در می‌آورد. می‌توانم اطلاعات رویت را به صورت ماشینی دربیاورم و از آن برای این تقویم استفاده کنیم. حقیقت این است که چون این به مرجع تقلید افراد ربط دارد و خیلی استاندارد نیست باید از روش‌های غیر استاندارد هم برای محاسبه استفاده کنیم.‬

ali90em commented 6 years ago

سلام، چرا نیمه شعبان و ولادت امام مهدی(عج) میشه ۱۶ شعبان؟ چهارشنبه ۱۲ اردیبهشت.

behdad222 commented 6 years ago

@ali90em این مشکل به خاطر متغییر بودن طول ماه‌های قمری رخ میده در حال حاضر مشغول رو کدی هستیم که این مشکل رو به صورت کامل حل کنیم ولی راه حل موقت عقب یا جلو بردن روز ماه‌های قمری هست که از قسمت تنظیمات در دسترسه

firouzian commented 5 years ago

@behdad222 ‮درود بر شما!‬ ‮این کد جدید که می‌فرمایید کجاست؟‬

ebraminio commented 5 years ago

روش کار استارکلندار سعید رسولی اعمال و تا حد خوبی مشکلات برطرف شده که حتی برای مناسبت‌های قمری از آن‌ها استفاده می‌کند ولی همچنان نیاز است تقویم سالانه به روز شود، نسخهٔ جدید در https://play.google.com/apps/testing/com.byagowi.persiancalendar قرار داده شده و به زودی منتشر می‌شود، با تشکر از همه دوستان بابت همفکری، مشکلات دیگر را در سایر فایل‌ها قرار دهید که در بالای سایر فایل‌ها قرار گیرند. ممنون :)

cloner93 commented 3 years ago

سلام به همگی، خسته نباشید. میخوام بدونم آیا کد کاربردی در این زمینه توسعه داده شده یا نه (منظورم مشکل تقویم قمریست)؟

اگر هست ممنون میشم به اشتراک بزارید.