امتیاز موضوع:
  • 0 رأی - میانگین امتیازات: 0
  • 1
  • 2
  • 3
  • 4
  • 5
برنامه تبدیل تاریخ میلادی به شمسی به زبان اسمبلی AVR وC
نویسنده پیام
ha_60 آفلاین
بنيانگذار سايت
******

ارسال‌ها: 4,637
موضوع‌ها: 216
تاریخ عضویت: آبان ۱۳۸۳

تشکرها : 560
( 6556 تشکر در 2385 ارسال )
ارسال: #1
برنامه تبدیل تاریخ میلادی به شمسی به زبان اسمبلی AVR وC
این هم برنامه تبدیل تاریخ میلادی به شمسی به زبان اسمبلی AVR و(C(codevision همراه با ذکر چند نکته راجع به الگوریتم تبدیل تاریخهای میلادی وشمسی به یکدیگر و منظور کردن سالهای کبیسه هر دو برنامه را دانلود کنید و به دلخواه و سلیقه خود در برنامه اصلی بگنجانید.مقادیر تاریخ میلادی را در مکانهای year,month,day وارد کرده و پس از فرآخوان برنامه تاریخ شمسی را در همان مکان ها بخوانید!



چند نکته راجع به الگوریتم تبدیل تاریخ میلادی به شمسی(و بالعکس) و سالهای کبیسه شمسی و میلادی

1-سالهاي شمسي و ميلادي هر دو 365 روزه هستند مگر در سالهاي کبيسه که 366 روز ميباشند که اين استثناء هر 4 سال يکبار اتفاق ميافتد. و دليل آن هم اينست که طول يکسال شمسي و يا ميلادي دقيقأ 365 روز يا (ساعت)24 *(روز)365 =8760 ساعت نميباشد بلکه تقريبأ 365 روز و 4/1 روز يا 6 ساعت است.

[مقدار دقیق یک سال خورشیدی یا اعتدالی (Solar Year,tropical Year)برابر با 365.2422 روز است بعبارت دیگر مدت زمان یکبار گردش کامل زمین به دور خورشید راکه آنراسال خورشیدی مینامندبرابر است با 365.2422 یا (4.1288192 /1 + 365 )روز متوسط .دائره المعارف دریائی - خسرو مشتری خواه]

براي جبران و احتساب اين شش ساعت اضافه هر سال بدين ترتيب عمل ميشود که 4 تا از اين شش ساعت ها که 24 ساعت يا يکروز ميشوند را هر 4 سال يکبار سر جمع حساب کرده و به يک سال (که به آن کبيسه ميگويند) اضافه ميکنند و درواقع بدين ترتيب تقويم تنظيم وکاليبزه ميشود که اين موضوع 6 ساعت اختلاف در هر سال را ميتوان در زمان تحويل سال شمسي مشاهده کرد که هر سال نسبت به سال قبل يا بعد حدود 6 ساعت اختلاف ساعت دارد و هر 4 سال يکبار تقريبأ تحويل سال يکي ميشودکه در نهايت اين اختلاف ساعت ها را هر 4 سال يکبار سر جمع کرده و به يکي از سالها(سال کبيسه)همانطوريکه ذکر شد اعمال ميکنند.

يافتن سالهاي کبيسه ميلادي وشمسي آسان است کافيست يک سال کبيسه را بدانيم و سالهاي 4+يا4- آنرا بدست اوريم مثلأ سال 2008 يک سال کبيسه است و همينطور سالهاي ...و 2000و2004و2008و2012و2016و2020و... سالهاي کبيسه بوده يا هستند.

در مورد سالهاي کبيسه شمسي نيز مثلأ سال 1387 سال کبيسه بوده و ...و1379و1383و1387و1391و1395و1399و1403و... نيزسال کبيسه ميباشند.

در واقع سالهاي آتي کبيسه قابل پيش بيني و منظور شدن در محاسبات هستند.و تقریبا هر 128 سال سالهای کبیسه همان مضارب 4 سال یکبار را تعقیب میکنند.

[هر 4 سال(هریک سال کبیسه) 0.7486 ساعت کم می آورد که در مجموع حدود هر 128 سال یکبار نیاز به تنظیم دارد]

2-شناسائي و دانستن تعداد روزهاي هرماه ازسال ميلادي و يا شمسي لازم است که تعداد روزهاي ماه هاي شمسي تا حدودي منطقي تر ومنظم تر هستند ليکن در هر 2 مورد تعداد روزهاي يک سال ميلادي يا شمسي مجموعأ 365 روز است به استثناء سال کبيسه که 366 روز بوده وآن يک روز اضافه را هم به انتهاي يکي از ماه هاي مشخص سال مربوطه اضافه ميشود که به قرار زير ميباشند:

+ (31 روز)تيـر[4] + (31 روز)خرداد[3] + (31 روز)ارديبهشت[2] + (31 روز)فروردين[1] = (365 روز)يـک سال شمســي

+ (30 روز)آبان[8] + (30 روز)مهــر[7] + (31 روز)شهريور[6] + (31 روز)مــرداد[5]

(29 روز)اسفند[12] + (30 روز)بهمـن[11] + (30 روز)دي[10] + (30 روز)آذر[9]

+ (30 روز)آوريل[4] + (31 روز)مارس [3] + (28 روز)فوريه[2] + (31 روز)زانويه[1] = (365 روز)يـک سال ميــلادي

+ (31 روز)آگوست[8] + (31 روز)جولاي[7] + (30 روز)ژوئن[6] + (31 روز)مــي[5]

(31 روز)دسامبر[12] + (30 روز)نوامبر[11] + (31 روز)اکتبر[10] + (30 روز)سپتامبر[9]

ملاحظه ميشود که جمع تعداد روزه هاي سال شمسي و ميلادي يکسان و 365 روز است اما تعداد روزهاي هر ماه آنها نسبت به يکديگر متفاوت است. شش ماه اول سال شمسي 31 روزه و 5ماه بعدي 30 روزه و ماه آخر 29 روزه ميباشدو ماهاي ميلادي هم که نظم بخصوي ندارند.

براي اضافه کردن يک روز سال کبيسه (که دانستن آن براي محاسبات تبديل مهم است)در سال شمسي آن را به آخرين ماه سال يعني اسفند اضافه ميکنند و ماه اسفند در سال کبيسه 30 روزه ميشود و در سال ميلادي آن را به ماه دوم سال يعني فوريه اضافه ميکنند که ماه فوريه در يک سال کبيسه ميلادي 29 روزه ميشود.[بنابراين اشتباه نشود سال کبيسه ميلادي از آخرين روز ماه دوم يعني فوريه عمل ميکند و ميبايست در محاسبات تبديل اعمال نمود لکن در سال شمسي در آخرين روز از ماه آخر يعني اسفند منظور ميشود][...اي ول وبارک اله به تقويم شمسي و ايراني خودمان که قرن ها پيش ایجاد و این قدر دقیق و منطقی وحساب شده تنظیم شده است ]

پس براي نوشتن و درک الگوريتم برنامه تبديل تقويم ها به يکديگر دانستن اطلاعات مربوط به تعداد روزه هاي هر ماه و اينکه سال کبيسه کدام سال بوده و روز اضافه شده در چه روزي از چه ماهي ميبايست اعمال گردد مهم است .

4-اغاز سال ميلادي يعني اولين روز زانويه در روز يازدهم از ماه دي سال شمسي ميباشدو آغاز سال شمسي يعني اولين روز فروردين در روز بيستم از ماه سوم ميلادي ميباشد بعبارت ديگر:

تاريخ ( 01/01/سال ميلادي ) مصادف است با ( 11/10/سال شمســي )

تاريخ ( 20/03/سال ميلادي ) مصادف است با ( 01/01/سال شمســي )

همينطور:

تاريخ ( 28/02/سال ميلادي ) مصادف است با ( 10/12/سال شمســي )



همه اين موارد فقط در مورد سالهاي غير کبيسه درست است و براي سال هاي کبيسه بطور مختصر اينگونه است :

کبيسه ميلادي : (31/12/سال کبيسه ميلادي) --> ( 11/10/سال شمسي)

(01/01/سال کبيسه ميلادي) --> ( 12/10/سال شمسي)

(02/28/سال کبيسه ميلادي) --> ( 09/12/سال شمسي)

 

کبيسه شمسي : (30/12/سال کبيسه شمسي) --> ( 20/03/سال ميلادي)

(01/01/سال کبيسه شمسي) --> ( 21/03/سال ميلادي)



5-يکي از راه هاي ساده تبديل تاريخ ميلادي به شمسي (وبالعکس) آنست که تعداد روزهاي سال ميلادي را تا تاريخ مورد نظر شمارش کرده و سپس سال شمسي را با توجه به تعداد روزهاي مفروض بدست امده بازسازي کنيم(وبالعکس)

مثلأ براي تبديل تاريخ 23/4/2007 داريم:

23[از ماه چهارم] + 31[ماه سوم] + 28[ماه دوم] + 31[ماه اول] = تعداد روزه هاي گذشته از اول سال ميلادي تا اين تاريخ

[روز] 113 =

حال اين تعداد روز را ميبايست با توجه به تعداد روزهاي هر ماه شمسي بازسازي نمود که البته دانستن اينکه از کجا و از چه مبدأي ميبايست شروع کنيم مهم است که نکته آن در بند 4 ذکر شد
(آخرین ویرایش در این ارسال: ۲۲-دى-۱۳۹۱, ۲۳:۰۸:۵۴، توسط babyy.)
۲۸-بهمن-۱۳۸۶, ۱۱:۱۷:۴۵
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : HoseinVig, t3r!p3000, E_ravari, aed, رسول
p_s آفلاین
تازه وارد

ارسال‌ها: 2
موضوع‌ها: 0
تاریخ عضویت: فروردین ۱۳۹۳

تشکرها : 1
( 6 تشکر در 2 ارسال )
ارسال: #2
RE: برنامه تبدیل تاریخ میلادی به شمسی به زبان اسمبلی AVR وC
سلام
یک نکته وجود دارد که هر 23 سال (البته دقیقا نمیدونم) بجای 4 سال یکبار کبیسه باشه سال کبیسه سال پنجم میشه
اگر به تقویم ها نگاه کنی سال 1370 کبیسه بوده ولی بجای سال 1374 سال 1375 کبیسه شد
من 20 سال پیش یک برنامه نوشتم یعنی حدود سالهای 1372 و از حدود 20 سال قبلش تقویم ها را چک کردم ولی در سال 1374 به یک مشکل برخوردم که سال 1374 علی القاعده بایستی کبیسه باشد نبود و سال 1375 کبیسه شد
این نکته را توجه کنید و برنامه بزبان پاسکال را دارم که راحت مشه به زبانهای دیگه تبدیل کرد
البته مبنا بعد از این جریان گرفته شده و باید یک منبع موثق پیدا کنم که کامل بشه
فعلا کار را راه می اندازه
برای تبدیل به بزبان C در Help برنامه میشه تغییرش داد

این برنامه زمان حال را میگیرد و بصورت یک عدد YYMMDD برمیگرداند

کد:
[/align][align=left]

function f_today:longint;
var
    d2:TDateTime;
    c1:longint;
    k1:byte;
    tm,td:word;
    ty:longint;
begin

    d2:=41353;       //SystemTimeToDateTime(d1);
    c1:=DaysBetween(now,d2);
    k1:=1;
    while c1>365 do
      begin
          c1:=c1-365;
          k1:=k1+1;
          if k1 mod 4 =0 then begin c1:=c1-1 end;
      end;
    ty:=1391+k1;
    case c1 of
       1..31:  begin tm:=1; td:=c1; end;
      32..62:  begin tm:=2; td:=c1-31; end;
      63..93:  begin tm:=3; td:=c1-62; end;
      94..124: begin tm:=4; td:=c1-93; end;
      125..155:begin tm:=5; td:=c1-124; end;
      156..185:begin tm:=6; td:=c1-155; end;
      186..215:begin tm:=7; td:=c1-185; end;
      216..245:begin tm:=8; td:=c1-215; end;
      246..275:begin tm:=9; td:=c1-245; end;
      276..305:begin tm:=10; td:=c1-275; end;
      306..335:begin tm:=11; td:=c1-305; end;
      336..366:begin tm:=12; td:=c1-335; end;
    end;
    ty:=(ty*10000)+(tm*100)+td;
    f_today:=ty;

end;
(آخرین ویرایش در این ارسال: ۱۴-فروردین-۱۳۹۳, ۲۰:۵۰:۳۰، توسط helma.)
۱۴-فروردین-۱۳۹۳, ۲۰:۴۷:۰۷
ارسال‌ها
پاسخ
تشکر شده توسط : helma, omid_phoenix, babyy, رسول
lord_viper غایب
مدیر کل انجمن
*****

ارسال‌ها: 3,949
موضوع‌ها: 352
تاریخ عضویت: بهمن ۱۳۸۴

تشکرها : 5193
( 9875 تشکر در 2650 ارسال )
ارسال: #3
RE: برنامه تبدیل تاریخ میلادی به شمسی به زبان اسمبلی AVR وC
ما چند نوع کبیسه داریم
کبیسه های 4 ساله
33ساله و 128 ساله که همینها باعث شده که تاریخ خورشیدی دقیقترین تاریخ باشه
مثلا کبیسه 33 ساله بعد از هر 7 کبیسه 4 ساله یک کبیسه 5 ساله داریم

چرا ؟
به خاطر 365.2422 همین 0.2422 که باید روند بشه

[تصویر:  xshon.png]
از آن نماز که خود هیچ از آن نمی فهمی خدا چه فایده و بهره اکتساب کند
تفاخری نبود مر خدای عالم را که چون تو ابلهی او را خدا حساب کند
۱۵-فروردین-۱۳۹۳, ۱۱:۱۰:۲۷
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : helma, omid_phoenix, babyy


موضوعات مرتبط با این موضوع...
موضوع نویسنده پاسخ بازدید آخرین ارسال
  ساعت با تاریخ شمسی - GLCD128x64 ha_60 7 9,438 ۰۷-اسفند-۱۳۸۹, ۱۵:۱۶:۴۹
آخرین ارسال: koorosh.k
  برنامه تبديل تاريخ ميلادي به شمسي به زبان اسمبلي 8051 ha_60 1 4,408 ۲۲-آذر-۱۳۸۶, ۰۹:۳۳:۴۲
آخرین ارسال: ha_60

پرش به انجمن:


کاربرانِ درحال بازدید از این موضوع: 1 مهمان

صفحه‌ی تماس | IranVig | بازگشت به بالا | | بایگانی | پیوند سایتی RSS