PDA

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



salar_sh
سه شنبه 27 بهمن 1383, 07:16 صبح
سلام
میدونم که تکراری ممکنه باشه ولی کسی الگوریتم تبدیل تاریخ میلادی به شمسی رو داره ؟

جستجو هم کردم ولی هر چی پیدا کردم غلط بودش . خودم هم یک روز وقت گذاشتم ولی باز هم مشکلاتی داره که با سالهای کبیسه هستش

کسی میتونه کمک کنه

در ضمن نمیخواهم محدودیت داشته باشه . میخواهم مثل تاریخ پارسا 99 یا 2003 کار بکنه

ممنون از همگی

ProgrammingLove
سه شنبه 27 بهمن 1383, 13:50 عصر
یه سر به www.PersianComponents.com بزن . یه Pdf داره وخصوص این کار

linux
سه شنبه 27 بهمن 1383, 17:07 عصر
قبلا تو همین سایت بحث شده توی گوگل دنبال calmath بگرد یک برنامه با سورس که تابع تبدیل اکثر تقویم ها را به هم دارد

salar_sh
چهارشنبه 28 بهمن 1383, 07:06 صبح
یه سر به www.PersianComponents.com بزن . یه Pdf داره وخصوص این کار


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

ProgrammingLove
چهارشنبه 28 بهمن 1383, 23:28 عصر
شرمنده : اینه http://www.farsicomponents.com

رضا جاسبی
شنبه 22 اسفند 1383, 14:52 عصر
نمی دونم این مشکل حل شده یا نه ! اگر حل شده لطفاً به من هم خبر بدید. اگر نشده من با این مشکل دست به گریبانم و یه جورایی دارم به جواب نزدیک می شوم. خوشحال می شوم اگر با کسی تعامل داشته باشم.

salar_sh
شنبه 22 اسفند 1383, 15:57 عصر
با سلام . مشکل من حل شد
الگوریتمش رو به زبان ویژوال بیسیک میتونی اینجا پیدا کنی
http://couprie.docspages.com/calmath/index.html
اگه سوالی داشتی بپرس . من تقریبا اطلاعات خوبی تو این زمینه پیدا کردم
در ضمن الگوریتمش کاملا علمی هست و 100 ٪ درست کار میکنه
البته تا جایی که من تست کردم
موفق باشید

رضا جاسبی
شنبه 22 اسفند 1383, 16:35 عصر
ممکنه کمی در موردش توضیح بدی ؟
یک نکته که من متوجه شدم از روش سالگشت 128 تایی برای سالهای کبیسه استفاده می کنه ولی تا جایی که من می دونم در تقویم ایران از روش سالگشت 33 تایی استفاده می شه.
ممنون می شم.

salar_sh
شنبه 22 اسفند 1383, 19:09 عصر
سلام
من درست نمیدونم . فقط میدونم که درست داره کار میکنه من برای خیلی از تاریخها چک کردم درست جواب میداد . شاید حق با شما باشه ولی برای من مهم این بود که درست کار کنه که میکنه :wink:

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

رضا جاسبی
شنبه 22 اسفند 1383, 20:26 عصر
دوست من متاسفانه من بیسیک کار نیستم و فرصت سر و کله زدن با این کد رو هم ندارم. ولی اگر تاریخهای 18 تا 22 مارس سالهای 1990 تا 2005 رو امتحان کنی و به خطایی برخورد نکنی احتمالا درست عمل می کنه.
و البته یک روز خاص مثلاً روز تولدت و یا اول ژانویه هر سال رو هم بگیر. اول ژانویه همیشه 11 دی ماه است بجز سالهای 1997 ، 2001 ، 2005 و احتمالا 2009 و ... که 12 دی ماه است. در واقع در سالهای 1375، 1379؛1383 و ... روز میلادی با شمسی یک روز اختلاف دارد. این به علت کبیسه نبودن سال 1374 بعد از سال 1370 ( فاصله 4 سال ) است.
اگر نتیجه را اعلام کنی ممنون می شوم. هر چند که فکر کنم باید روش خودم رو با C ادامه بدم.

linux
یک شنبه 23 اسفند 1383, 14:05 عصر
اگر نتیجه را اعلام کنی ممنون می شوم. هر چند که فکر کنم باید روش خودم رو با C ادامه بدم.
این الگوریتم ها در عین سادگی و راحتی بسیار دقیق و کار آمد هستند

رضا جاسبی
یک شنبه 23 اسفند 1383, 15:10 عصر
Linux عزیز من متوجه منظورت نشدم. کدوم الگوریتمها ؟ روشی که در سایت مورد اشاره من و salar_sh (http://couprie.docspages.com/calmath/index.html) بکار رفته بود اصلا ساده و راحت نبود. من هنوز نرسیدم امتحان کنم ببینم درست کار می کنه یا نه ولی درک روش محاسبه اون اصلا ساده نیست. البته یه چیزایی متوجه شدم که تاریخ میلادی رو به عدد روز تبدیل می کنه و بعد عدد روز رو به هر تاریخی که بخواهیم از جمله شمسی می شود تبدیل کرد. مبنای کار هم فکر کنم سال 45 قبل از میلاد باشه.
من تقریبا به همین روش دارم برنامه خودمو تمام می کنم. و البته مبنای کارم رو گذاشتم سال 1980 به بعد که دقیقا درست کار می کنه. شرمنده ! قبلش به دردم هم نمی خوره ولی با روشی که جلو رفتم فکر کنم که مبنا رو هر چقدر عقب ببریم هم کار کنه. ولی مثلا تقویم هجری شمسی در تاریخ 45 قبل از میلاد یعنی چی ؟

رضا جاسبی
یک شنبه 23 اسفند 1383, 15:55 عصر
بازم من یک اشتباه کردم. :sorry: مبنای کار سایت مورد اشاره اگر اشتباه نکنم!!!!! 4713 قبل از میلاد است. حد اقل این رو مطمئنم که بیش از 4000 سال قبل از میلاده !

salar_sh
یک شنبه 23 اسفند 1383, 19:37 عصر
بسیار خوب . من یه تستی میکنم . من کد رو به به دلفی برگردوندم و البته یه سری توابعی هم که لازم داشتم رو ایجاد کردم . فعلا هم که درست کار میکردش .

موفق باشی و خداحافظ

رضا جاسبی
دوشنبه 24 اسفند 1383, 13:42 عصر
من کد داده شده در اون سایت رو به زبان C تبدیل کردم و امتحان کردم درست عمل می کند. همانطور که قبلاً گفتم فکر می کنم این روش سال کبیسه را بر مبنای سالگشت 128 تایی محاسبه می کند. البته از الگوریتم فوق چیز زیادی سر در نیاوردم و این فقط یک حدس است. اما فکر کنم روشی که در تقویم ایران استفاده میشود 33 تایی است یعنی اگر باقیمانده تقسیم سال بر 33 یکی از اعداد 1،5،9،13،17،22،26،30 باشد آن سال کبیسه است. به هر حال هر دو روش تاریخ فعلی را درست حساب می کند.
من ترجیح دادم که بر مبنای روش 33 تایی این برنامه را خودم بنویسم. البته اگر قبلاً این برنامه را پیدا می کردم شاید ازش استفاده می کردم اما تقریبا به جواب رسیده بودم که این برنامه رو دیدم. فرمول من هم همانی است که در کد سایت مذکور پیاده شده. یعنی تعداد روزها را تا یک مبدا تاریخی ( من اول ژانویه در نظر گرفتم و سال را آزاد گذاشتم که برنامه نویس خودش تعریف کند اما در روش سایت از 1/1/1 در تقویم Julian به عنوان مبنا استفاده می کنه) محاسبه می کنیم و تاریخ مبدا را به شمسی محاسبه و تاریخ متناظر تعداد روزهای گذشته از آن تاریخ مبنا را به تقویم شمسی بدست می آوریم.
یک برنامه تستی ساده برای مقایسه این دو روش نوشتم و از سال 1800 میلادی تا 2500 رو مقایسه کردم. در سالهای 1209، 1242، 1403، 1436، 1469، 1502، 1531، 1535، 1564، 1568، 1597، و ... این دو روش در سال کبیسه اختلاف دارند. یعنی مثلاً روش 128 تایی سال 1209 و 1242 را کبیسه می بیند اما روش 33 تایی 1210 و 1243 را. و برای سالهای دیگر بر عکس یعنی 33 تایی اول کبیسه می بیند. البته این اختلاف از 140 سال پیش و تا 20 سال دیگر وجود ندارد و هر دو روش قابل اعتماد است.
سه فایل JDN.C روش سایت مورد اشاره دوستمون ، Shamsi.c روش من و Compare.C به مقایسه این دو روش می پردازد. ( بابا جمله ادبی :oops: )
من به شخصه از دومی ( Shamsi.C ) استفاده می کنم. سادگی خوانایی این روش فوق العاده است. یک کمی ابداع خودمه ! تعریف از خود ...

salar_sh
دوشنبه 24 اسفند 1383, 21:18 عصر
پس به نظر شما مشکلی نداره ؟

من که تا اینجا ایرادی ندیدم ازش

موفق باشید

linux
دوشنبه 24 اسفند 1383, 23:16 عصر
یه خورده اگر در مورد ذخیره سازی تاریخ در ویندوز مطالعه کنی می بینی که ویندوز هم از این روش استفاده کرده یعنی تبدیل تاریخ به یک عدد ولی مبنای ویندوز 1899/12/30 هست. و تاریخ هم بصورت یک متغیر doublae ذخیره می شود. یعنی تاریخ 1899/12/30 بصورت عدد 0 ذخیره می شه.
http://www.astro.uni.torun.pl/~kb/Papers/EMP/PersianC-EMP.htm
این صفحه را نگاه کن تا 2099 میلادی لحضه سال تحویل و روز سال تحویل را حساب کرده بعد این روز ها را با برنامه خودت و الگوریتم jdn که نوشتی حساب کن. یه برنامه تبدیل تاریخ هم با فورترن نوشته
و jdn هم یک چیز من در آوردی نیست و مبدا ان هم که حدود 4000 سال پیش هست دلیل خاص خودش را دارد.

رضا جاسبی
سه شنبه 25 اسفند 1383, 10:07 صبح
حالا چرا اینقدر خشن Linux جان؟ من کی گفتم که Jdn یک چیز من در آوردی است ؟ فقط تو پیام چند تا قبل ترم پرسیدم که تاریخ هجری شمسی در 45 سال قبل از میلاد چه معنی می دهد؟ در واقع اگر هم بخواهیم معنی دار فکر کنیم چه فرقی می کند که در آن سال روز 15 مارس!! مثلاً 25 اسفند باشد یا 26 و یا 24 ؟
چیزی که من در آدرس شما دیدم تحویل سال 1403 ( که بعد از 1900 میلادی اولین سال اختلاف دو روش مورد نظر ماست ) 2025 20 9:01 محاسبه شده ! یعنی 20 مارس 2025 ساعت 9:01 صبح به وقت گرینویچ که به وقت تهران تقریباً می شه 12:30 . فکر می کنم بزرگان گفتنه اند که اگر تحویل سال قبل از ظهر بود روز اول فروردین و اگر بعد از ظهر بود روز آخر اسفند است و ساعت 12:30 نشون دهنده اینه که تحویل سال روز آخر اسفند است. اما 20 مارس 2025 در روش Jdn اول فروردین 1404 و در روش 33 تایی که من استفاده کردم 30 اسفند 1403 است. البته در کد فرترن و نسخه اجرایی آن هم دیدم که از روش سالگشت 33 تایی استفاده کرده است.
جون من نگو همه را با هم چک کن ! من و Jdn مصالحه کردیم. فقط 20 سال دیگه دعوامون می شه که تا اون موقع کی مرده کی زنده ! من این تبدیل رو برای یک برنامه کامپیوتری می خواهم که تا 20 سال دیگه منطقاً زنده نیست.
راستی یه سوال دیگه ! مبنای تاریخ ویندوز که در واقع اول سال 1900 است برای تقویم میلادیه یا هجری شمسی هم داره ؟ در واقع اینطوری بهتر است که بگویم آیا ویندوز تقویم هجری شمسی هم حساب می کند یا خیر ؟
همیشه سرفراز و موفق باشی.

mr_esmaily
دوشنبه 29 فروردین 1384, 00:12 صبح
سلام

الگوریتمش رو به زبان ویژوال بیسیک میتونی اینجا پیدا کنی
http://couprie.docspages.com/calmath/index.html
جل الخالق! مخابرات اینم فیلتر کرده؟!
اگه امکانش هست کد های سایت فوق را در همین جا بنویسید.

رضا جاسبی
چهارشنبه 26 مرداد 1384, 15:55 عصر
دوستان عزیز سلام.
احتمالاً کسی از شماها هست که فایلهایی رو که من Upload کرده بودم ( Shamsi.c , JDN.C و Compare.C ) رو Download کرده و داشته باشه. من خودم لازمشون دارم ولی کامپیوترم پرید و ندارمشون.

Mohammad_Mnt
جمعه 28 مرداد 1384, 12:59 عصر
برای تاریخ هجری خورشیدی :
اگر باقیمانده تقسیم سال بر 33 یکی از اعداد زیر باشد ، سال کبیسه است :
1-5-9-13-17-22-26-30

برای سال میلادی :
کلیه سال هایی که بر 4 بخش پذیر هستند به جز سال هایی که بر 100 بخش پذیر هستند ولی بر 400 بخش پذیر نیستند ( مثل سال 2100 که کبیسه نیست )

radium
جمعه 18 اردیبهشت 1388, 23:10 عصر
سلام برنامش اینجاست.
http://binaryearth.blogfa.com/post-18.aspx

radium
چهارشنبه 13 خرداد 1388, 15:30 عصر
سورس برنامه رو تو این پست(لینک زیر) گذاشتم. اگه سوالی بود درخدمتم.
http://binaryearth.blogfa.com/post-25.aspx