صفحه 1 از 2 12 آخرینآخرین
نمایش نتایج: از 1 به 10 از 11
Like Tree8 لایک

موضوع: كسي راهي براي تبديل تاريخ ds1307 به شمسي سراغ داره؟

  1. #1
    Junior Member
    تاریخ عضویت
    Feb 2015
    نوشته ها
    2

    كسي راهي براي تبديل تاريخ ds1307 به شمسي سراغ داره؟

    سلام دوستان

    من اين دو تا فايل رو با كلي سرچ پيدا كردم. Date.h رو با كمي تغيير روي آردينو آپلود كردم اما خروجي غلط ميده.

    اون يكي كد رو هم نميدونم چجوري بايد استفاده كرد. كسي راهه ديگه اي بلد نيست ؟ ( براي آردوينو به زبان C )


    ####

    متاسفانه نميزاره من فايل آپلود كنم كدش رو همينجا مينويسم واستون :

    Date.h

    کد:
    #include<math.h> //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Input : Milady(iYaer,iMonth,iDay) // Output : Shamsy(Yaer,Month,Day) //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ void Milady2Shamsy(int iYear , int iMonth , int iDay , int *Year , int *Month , int *Day) { int jdn,jdn2,depoch,cycle,cyear,ycycle,aux1, aux2,yday; int epbase,epyear,mdays; const int PERSIAN_EPOCH = 1948321 ; if((iYear > 1582) || ((iYear == 1582) && (iMonth > 10)) || ((iYear == 1582) && (iMonth == 10) && (iDay > 14))) jdn = ((1461*(iYear+4800+((iMonth-14) / 12))) / 4)+((367*(iMonth-2-12*(((iMonth-14) / 12)))) / 12)-((3*(((iYear+4900+((iMonth-14) / 12)) / 100))) / 4)+iDay-32075; else jdn = 367 * iYear - ((7 * (iYear + 5001 + ((iMonth - 9) / 7))) / 4) + ((275 * iMonth) / 9) + iDay + 1729777; epbase = 475-474; epyear = 474 + (fmod(epbase , 2820)) ; mdays = (1 - 1) * 31 ; jdn2 = 1+mdays+ floor(((epyear*682)-110)/ 2816)+(epyear-1)*365+floor(epbase / 2820)*1029983+(PERSIAN_EPOCH-1); depoch = jdn-jdn2; cycle = floor(depoch / 1029983); cyear = fmod(depoch , 1029983) ; if(cyear == 1029982) ycycle = 2820; else { aux1 = floor(cyear / 366); aux2 = fmod(cyear , 366); ycycle = (((2134*aux1)+(2816*aux2)+2815) / 1028522)+aux1+1; } iYear = ycycle + (2820*cycle) + 474; if(iYear <= 0) iYear = iYear-1; if(iYear >= 0) epbase = iYear-474; else epbase = iYear-473; epyear = 474 + fmod(epbase , 2820); mdays = (1-1)*31; jdn2 = 1+mdays+floor(((epyear*682)-110)/ 2816)+(epyear-1)*365 + floor(epbase / 2820)*1029983+(PERSIAN_EPOCH-1); yday = (jdn-jdn2)+1; if(yday <= 186) { if(yday < 0) iMonth = (-abs(yday / 31)); else if(yday > 0) iMonth = -1 * (-abs(yday / 31)); else iMonth = 0; } else { if((yday - 6) < 0) iMonth = (-abs((yday - 6) / 30)); else if((yday - 6) > 0) iMonth = -1 * (-abs((yday - 6) / 30)); else iMonth = 0; //iMonth = -sign(((yday - 6) / 30)) * (-abs((yday - 6) / 30)); } if(iYear >= 0) epbase = iYear-474; else epbase = iYear-473; epyear = 474 + fmod(epbase , 2820); if(iMonth <= 7) mdays = (iMonth-1)*31; else mdays = (iMonth-1)*30+6; jdn2 = 1 + mdays + floor(((epyear*682)-110) / 2816) + (epyear-1)*365 + floor(epbase / 2820)*1029983 + (PERSIAN_EPOCH - 1); iDay = (jdn - jdn2) + 1; //aa:=inttostr(iYear)+'/'+inttostr(iMonth)+'/'+inttostr(iDay); if(iMonth < 7) while(iDay > 31) { iMonth++; iDay -= 31; } else while(iDay > 30) { iMonth++; iDay -= 30; } *Year = iYear; *Month = iMonth; *Day = iDay; }

  2. #2
    Junior Member
    تاریخ عضویت
    Feb 2015
    نوشته ها
    2
    Persian.cpp

    کد:
    /* persian.cpp: test code for computing the Persian (Jalali) calendar Copyright (C) 2010, Project Pluto This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include <math.h> #include "watdefs.h" #include "afuncs.h" #define PI 3.1415926535897932384626433832795028841971693993751058209749445923 /* See this code also in DATE.CPP. It determines the date of the beginning of the Persian year, in JD form. It so happens that this can be expressed, in somewhat "condensed" form, using the following not-too-terribly-complex algorithm. The main( ) code provides a test routine comparing the results of this algorithm to those derived the "right" way (computing the time of the March equinox, subtracting Delta-T, adding the longitude of Teheran.) */ #define JALALI_ZERO 1947954L #define LOWER_PERSIAN_YEAR -1096 #define UPPER_PERSIAN_YEAR 2327 static long jalali_jd0( const int jalali_year) { static const short breaks[12] = { -708, -221, -3, 6, 394, 720, 786, 1145, 1635, 1701, 1866, 2328 }; static const short deltas[12] = { 1108, 1047, 984, 1249, 952, 891, 930, 866, 869, 844, 848, 852 }; int i; long rval; if( jalali_year < LOWER_PERSIAN_YEAR) return( -1L); /* out of valid range */ for( i = 0; i < 12; i++) if( jalali_year < breaks[i]) { rval = JALALI_ZERO + (long)jalali_year * 365L + (long)( deltas[i] + jalali_year * 303L) / 1250L; if( i < 3) /* zero point drops one day in first three blocks */ rval--; return( rval); } return( -1L); /* out of valid range */ } #include <stdio.h> #include <stdlib.h> /* I found a value for the longitude of Teheran of E 51 26'. I'm not absolutely sure, though, that this coincides with the longitude of the observatory used for the Persian calendar. If it's off by a few arcminutes, then it is conceivable that, in situations where the equinox is almost exactly at noon Teheran time, the calendar would be off by one day during that year. */ #define TEHERAN_LONGITUDE ((51. + 26. / 60.) / 360.) /* The longitude of Paris is that given for MPC station 007: */ #define PARIS_LONGITUDE (2.3371 / 360.) int revolutionary = 1; double get_solstice_equinox_date( double jd); static double jd_equinox( long year) { double jd0, y = (double)( year - 2000L) / 1000.; if( revolutionary) /* we're after the autumnal equinox */ jd0 = 2451810.217 + y * 365242.01767; else /* after the spring equinox */ jd0 = 2451623.809 + y * 365242.37404; return( get_solstice_equinox_date( jd0)); } int main( int argc, const char **argv) { long year = atol( argv[1]), n_years, year0; int i, j; double longitude; for( i = 3; i < argc; i++) { if( argv[i][0] == '-') { switch( argv[i][1]) { case 'j': revolutionary = 0; printf( "Switching to Persian (Jalaali) calendar\n"); break; default: printf( "Unknown option %s\n", argv[i]); exit( -1); break; } for( j = i; j < argc - 1; j++) /* remove the switch */ argv[j] = argv[j + 1]; i--; argc--; } } longitude = (revolutionary ? PARIS_LONGITUDE : TEHERAN_LONGITUDE); year0 = (revolutionary ? 1791L : 621L); if( argc == 2) printf( "%.5lf\n", jd_equinox( year)); if( argc == 3) { n_years = atol( argv[2]); while( n_years--) { long greg_year = year + year0; double jd1 = jd_equinox( greg_year ) + longitude; double jd2 = jd_equinox( greg_year + 1L) + longitude; double delta_t = td_minus_ut( 2451545. + (double)(greg_year - 2000L) * 365.25); long remains, n_days, is_leap; /* Subtract delta_t, to convert the ET (Ephemeris Time) */ /* value given by jd_equinox( ) into a UT value. */ jd1 -= delta_t / 86400.; jd2 -= delta_t / 86400.; n_days = (long)( floor( jd2) - floor( jd1)); printf( "%ld, %ld: %ld ", greg_year, year, n_days); /* 'Is_leap' is determined using the 33-year */ /* cycle used in some other programs. */ remains = year % 33; if( remains > 18) remains--; is_leap = (remains % 4L == 1L); printf( is_leap ? "Is leap\n" : "Is normal\n"); /* Check to see if the 33-year cycle method */ /* matches the 'accurate' method: */ if( n_days - is_leap != 365L) printf( "DANGER! ALERT!\n"); /* Now check to see if my own algorithm matches */ /* the 'accurate' method (it does, over the */ /* years in question): */ if( (long)jd1 != jalali_jd0( (int)year)) printf( "PANIC: %lf, %ld\n", jd1, jalali_jd0( (int)year)); year++; } } /* The following code was used in creating the */ /* list of 'breaks' and 'deltas' used in the */ /* jalali_jd0( ) function. It computes the JD */ /* of the start of the Persian calendar over a */ /* given range of years; then it tries to find */ /* 'delta' value(s) for which the simplified */ /* method of the jalali_jd0( ) returns correct */ /* values. It's of basically historical */ /* interest now. */ /* e.g: 'persian 1145 1635 303 1250' verifies */ /* a date range used in the jalali_jd0() */ /* function in date.cpp (and shown above) */ if( argc >= 4) { long y1 = atol( argv[1]); long y2 = atol( argv[2]); long *jds = (long *)calloc( (size_t)(y2 - y1), sizeof( long)); long year, offset, max_year = -100000; long const1 = atol( argv[3]), const2 = 10000L; if( !jds) { printf( "Out of memory\n"); exit( 0); } if( !const1) { const1 = 683L; /* usual rule */ const2 = 2820L; } else if( argc == 5) const2 = atol( argv[4]); for( year = y1; year < y2; year++) { long greg_year = year + year0; double jd1 = jd_equinox( greg_year) + longitude; double delta_t = td_minus_ut( 2451545. + (double)(greg_year - 2000L) * 365.25); jd1 -= delta_t / 86400.; if( revolutionary) /* Jalaali calendar is noon-based, */ jd1 += .5; /* Revolutionary is midnight-based */ jds[year - y1] = (long)floor( jd1); } for( offset = 0; offset < const2; offset++) { long jd0 = jds[0] - y1 * 365L - ( y1 * const1 + offset) / const2; int mismatch = 0; for( year = y1; !mismatch && year < y2; year++) { long jd_algo = jd0 + year * 365L + ( year * const1 + offset) / const2; if( jd_algo != jds[year - y1]) { mismatch = 1; if( year > max_year) max_year = year; } } if( !mismatch) printf( "Offset: %ld JD0: %ld\n", offset, jd0); } printf( "Max year reached: %ld\n", max_year); free( jds); } return( 0); }

  3. #3
    Member
    تاریخ عضویت
    Feb 2016
    نوشته ها
    41
    براي تبديل تاريخ شمسي به ميلادي و برعکس بايد تعداد روزهاي سپري شده از ابتداي هر کدام از اين تاريخ*ها را از مبدا خود به دست بياوريم. اگر مي*خواهيم تاريخ شمسي را به ميلادي تبديل کنيم ابتدا بايد روزهاي سپري شده از مبدا تاريخ شمسي تا کنون را حساب کنيم و آن را به اضافه**ي 226899 بکنيم. عدد به دست آمده تعداد روزهاي گذشته از ابتداي تاريخ ميلادي تا کنون است و با استفاده از آن مي*توانيم تاريخ ميلادي را حساب کنيم. براي تبديل تاريخ ميلادي به شمسي همين کار را بايد برعکس انجام بدهيم و عدد 226899 را بايد از تعداد روزهاي تاريخ ميلادي کم بکنيم و در اين قسمت عدد به دست آمده تاريخ شمسي است.
    همين روش نيز براي تبديل تاريخ قمري به شمسي و برعکس نيز قابل استفاده است. ولي در اين مورد ديگر عددي که بايد اضافه يا کم بشود 226899 نيست.
    شايد از خود بپرسيد که عدد 226899 را از کجا به دست آورده**ام. براي به دست آوردن اين عدد بايد تاريخ شمسي و ميلادي يک روز را در اختيار داشته باشيد. به عنوان مثال 13/4/1383 شمسي طبق تقويم برابر 3/7/2004 ميلادي است. کاري که بايد الا بکنيم اين است که اين دو تاريخ را به روز تبديل کنيم و در اين تبديل بايد تعداد سال*هاي کبيسه*اي که اين دو تاريخ پشت سر گذاشته*اند نيز فراموش نکنيم. براي اينکه تعداد سال*هاي کبيسه را در دو تقويم ميلادي و شمسي بخواهيم محاسبه کنيم بايد 1382 را براي تقويم شمسي و 2003 را براي تقويم ميلادي تقسيم بر 4 کنيم. خارخ قسمت اين دو تقسيم به ترتيب تعداد سال*هاي کبيسه*ي تقويم شمسي و ميلادي است که از ابتداي شروع به کار اين تقويم*ها تا کنون پشت سر گذاشته*اند. البته اين اعداد مطابق واقعيت نيستند! ولي به محاسبات ما اشکالي وارد نمي*کنند.
    در تقسيم 1382 بر 4 خارج قسمت برابر 345 مي*شود و اين عدد براي تقويم ميلادي برابر 500 است.
    خب پس تا کنون بر اساس تقويم شمسي 345 سال کبيسه بوده و بر اساس تقويم ميلادي 500 سال برابر سال کبيسه بوده*اند. (البته همان طور که ديد به کبيسه بودن سالي که در آن هستيم هنوز توجهي نکرديم.(
    خب برگرديم به مساله*ي خودمان که مي*خواستيم دو تاريخ 13/4/1383 و 3/7/2004 به روز تبديل کنيم.
    براي اين کار بايد از عدد سال يکي کم کرده و در 365 ضرب کنيم. و از عدد ماه نيز بايد يکي کم کرده و بر اساس نوع تقويم بايد عدد ماه را ضرب در عدد خاصي بکنيم. مثلا وقتي در تاريخ شمسي از عدد ماه يکي کم کنيم حاصل 3 مي*شود. همان طور که مي*دانيد در تقويم شمسي 3 ماه اول سال 31 روز دارند، پس 3 را در 31 ضرب مي*کنيم. ولي در تاريخ شمسي وقتي از 7 يکي کم کينم برابر 6 مي*شود. خب بايد در اين مورد ببينيم که 6 ماه اول سال ميلادي چند روزه هستند.
    ماه اول ميلادي = 31 روز
    ماه دوم ميلادي = 28 روز (در سال کبيسه 29 روز (
    ماه سوم ميلادي = 31 روز
    ماه چهارم ميلادي = 30 روز
    ماه پنجم ميلادي = 31 روز
    ماه ششم ميلادي = 30 روز
    ماه هفتم ميلادي = 31 روز
    ماه هشتم ميلادي = 31 روز
    ماه نهم ميلادي = 30 روز
    ماه دهم ميلادي = 31 روز
    ماه يازدهم ميلادي = 30 روز
    ماه داوزدهم ميلادي = 31 روز
    طبق جدول بالا 6 ماه اول سال 2004 ميلادي برابر 182 روز مي*باشد. (فراموش نکنيد که سال 2004 سال کبيسه است.) خب تا حالا عدد سال و ماه را به روز تبديل کرديم و اين دو عدد را بايد به اضافه*ي عدد روز کنيم و در آخر به اضافه*ي تعداد سال*هاي کبيسه گذشته بکنيم. داريم
    a = (1382*365)+(3*31)+13+345 = 504881
    b= (2003*365)+(31+29+31+30+31+30)+3+500=731780
    b-a = 226899
    با محاسبات فوق خواستم نشان بدهم که عدد 226899 که در اول بحث گفتيم را از کجا آورديم. همان طور که احتمالا تا حالا فهميديد اين عدد (226899) تفاوت مبداهاي دو تقويم ميلادي و شمسي به روز هستند.
    حال مثالي مي*زنم براي تبديل تاريخ شمسي به تاريخ ميلادي. فرض کنيد که مي*خواهيم که تاريخ 15/4/1383 شمسي را به تاريخ ميلادي نظير آن تبديل کنيم. در ابتدا بايد اين تاريخ را به روز تبديل کنيم. طبق روش گفته شده در بالا مي*نويسيم:
    C =[(1383-1)*365]+[(4-1)*31]+15+345 = 504883
    خب اين عدد را بايد به اضافه*ي 226899 بکنيم:
    504883+226899 = 731782
    حال بايد 731782 را به تاريخ ميلادي متناظر آن تبديل کنيم.
    ابتدا بايد تعدا سال*هاي کبيسه*ي تقويم ميلادي را از اين عدد کنيم، در بالا ديديم که تقويم ميلادي تا کنون 500 سال کبيسه را پشت سر گذاشته است.
    731782-500=731282
    حال 731282 را بر 365 تقسيم مي*کنيم و خارج قسمت آن را به اضافه*ي يک مي*کنيم و عدد به دست آمده عدد سال است:
    731282 / 365 = 2003
    2003 + 1= 2004
    باقيمانده*ي تقسيم فوق برابر 187 مي*باشد. حال با استفاده از جدول تعداد روز*هاي تقويم ميلادي شروع مي*کنيم از 187 کم مي*کنيم و باز هم فراموش نمي*کنيم که سال 2004 ميلادي سال کبيسه است :
    187-31=156
    156-29=127
    127-31=96
    96-30=66
    66-31=35
    35-30=5
    خب تفريق*هاي فوق را تا جايي ادامه مي*دهيم که عدد به دست آمده کمتر از تعداد روزهاي يک ماه باشند. در بالا 6 مرحله تفريق انجام دهيم به عدد 6 بايد يک بيافزاييم تا تعداد ماه*ها به دست آيد. و عدد ظاهر شده در تفريق آخر نيز برابر عدد روز مي*باشد. پس با محاسبات فوق ديديم که تاريخ 15/4/1383 شمسي برابر 5/7/2004 است.
    اين روش کلي تبديل دو تاريخ به يکديگر است. و براي تبديل انواع تقويم به هم بايد اين مراحل را انجام داد ولي با توجه به نوع تقويم*ها عددهايي که بايد اضافه يا کم بشود طبعا فرق مي*کند.
    موفق باشيد
    لایک کردن

  4. #4
    Member
    تاریخ عضویت
    Feb 2016
    نوشته ها
    41
    نقل قول نوشته اصلی توسط hamed82 نمایش پست ها
    براي تبديل تاريخ شمسي به ميلادي و برعکس بايد تعداد روزهاي سپري شده از ابتداي هر کدام از اين تاريخ*ها را از مبدا خود به دست بياوريم. اگر مي*خواهيم تاريخ شمسي را به ميلادي تبديل کنيم ابتدا بايد روزهاي سپري شده از مبدا تاريخ شمسي تا کنون را حساب کنيم و آن را به اضافه**ي 226899 بکنيم. عدد به دست آمده تعداد روزهاي گذشته از ابتداي تاريخ ميلادي تا کنون است و با استفاده از آن مي*توانيم تاريخ ميلادي را حساب کنيم. براي تبديل تاريخ ميلادي به شمسي همين کار را بايد برعکس انجام بدهيم و عدد 226899 را بايد از تعداد روزهاي تاريخ ميلادي کم بکنيم و در اين قسمت عدد به دست آمده تاريخ شمسي است.
    همين روش نيز براي تبديل تاريخ قمري به شمسي و برعکس نيز قابل استفاده است. ولي در اين مورد ديگر عددي که بايد اضافه يا کم بشود 226899 نيست.
    شايد از خود بپرسيد که عدد 226899 را از کجا به دست آورده**ام. براي به دست آوردن اين عدد بايد تاريخ شمسي و ميلادي يک روز را در اختيار داشته باشيد. به عنوان مثال 13/4/1383 شمسي طبق تقويم برابر 3/7/2004 ميلادي است. کاري که بايد الا بکنيم اين است که اين دو تاريخ را به روز تبديل کنيم و در اين تبديل بايد تعداد سال*هاي کبيسه*اي که اين دو تاريخ پشت سر گذاشته*اند نيز فراموش نکنيم. براي اينکه تعداد سال*هاي کبيسه را در دو تقويم ميلادي و شمسي بخواهيم محاسبه کنيم بايد 1382 را براي تقويم شمسي و 2003 را براي تقويم ميلادي تقسيم بر 4 کنيم. خارخ قسمت اين دو تقسيم به ترتيب تعداد سال*هاي کبيسه*ي تقويم شمسي و ميلادي است که از ابتداي شروع به کار اين تقويم*ها تا کنون پشت سر گذاشته*اند. البته اين اعداد مطابق واقعيت نيستند! ولي به محاسبات ما اشکالي وارد نمي*کنند.
    در تقسيم 1382 بر 4 خارج قسمت برابر 345 مي*شود و اين عدد براي تقويم ميلادي برابر 500 است.
    خب پس تا کنون بر اساس تقويم شمسي 345 سال کبيسه بوده و بر اساس تقويم ميلادي 500 سال برابر سال کبيسه بوده*اند. (البته همان طور که ديد به کبيسه بودن سالي که در آن هستيم هنوز توجهي نکرديم.(
    خب برگرديم به مساله*ي خودمان که مي*خواستيم دو تاريخ 13/4/1383 و 3/7/2004 به روز تبديل کنيم.
    براي اين کار بايد از عدد سال يکي کم کرده و در 365 ضرب کنيم. و از عدد ماه نيز بايد يکي کم کرده و بر اساس نوع تقويم بايد عدد ماه را ضرب در عدد خاصي بکنيم. مثلا وقتي در تاريخ شمسي از عدد ماه يکي کم کنيم حاصل 3 مي*شود. همان طور که مي*دانيد در تقويم شمسي 3 ماه اول سال 31 روز دارند، پس 3 را در 31 ضرب مي*کنيم. ولي در تاريخ شمسي وقتي از 7 يکي کم کينم برابر 6 مي*شود. خب بايد در اين مورد ببينيم که 6 ماه اول سال ميلادي چند روزه هستند.
    ماه اول ميلادي = 31 روز
    ماه دوم ميلادي = 28 روز (در سال کبيسه 29 روز (
    ماه سوم ميلادي = 31 روز
    ماه چهارم ميلادي = 30 روز
    ماه پنجم ميلادي = 31 روز
    ماه ششم ميلادي = 30 روز
    ماه هفتم ميلادي = 31 روز
    ماه هشتم ميلادي = 31 روز
    ماه نهم ميلادي = 30 روز
    ماه دهم ميلادي = 31 روز
    ماه يازدهم ميلادي = 30 روز
    ماه داوزدهم ميلادي = 31 روز
    طبق جدول بالا 6 ماه اول سال 2004 ميلادي برابر 182 روز مي*باشد. (فراموش نکنيد که سال 2004 سال کبيسه است.) خب تا حالا عدد سال و ماه را به روز تبديل کرديم و اين دو عدد را بايد به اضافه*ي عدد روز کنيم و در آخر به اضافه*ي تعداد سال*هاي کبيسه گذشته بکنيم. داريم
    a = (1382*365)+(3*31)+13+345 = 504881
    b= (2003*365)+(31+29+31+30+31+30)+3+500=731780
    b-a = 226899
    با محاسبات فوق خواستم نشان بدهم که عدد 226899 که در اول بحث گفتيم را از کجا آورديم. همان طور که احتمالا تا حالا فهميديد اين عدد (226899) تفاوت مبداهاي دو تقويم ميلادي و شمسي به روز هستند.
    حال مثالي مي*زنم براي تبديل تاريخ شمسي به تاريخ ميلادي. فرض کنيد که مي*خواهيم که تاريخ 15/4/1383 شمسي را به تاريخ ميلادي نظير آن تبديل کنيم. در ابتدا بايد اين تاريخ را به روز تبديل کنيم. طبق روش گفته شده در بالا مي*نويسيم:
    C =[(1383-1)*365]+[(4-1)*31]+15+345 = 504883
    خب اين عدد را بايد به اضافه*ي 226899 بکنيم:
    504883+226899 = 731782
    حال بايد 731782 را به تاريخ ميلادي متناظر آن تبديل کنيم.
    ابتدا بايد تعدا سال*هاي کبيسه*ي تقويم ميلادي را از اين عدد کنيم، در بالا ديديم که تقويم ميلادي تا کنون 500 سال کبيسه را پشت سر گذاشته است.
    731782-500=731282
    حال 731282 را بر 365 تقسيم مي*کنيم و خارج قسمت آن را به اضافه*ي يک مي*کنيم و عدد به دست آمده عدد سال است:
    731282 / 365 = 2003
    2003 + 1= 2004
    باقيمانده*ي تقسيم فوق برابر 187 مي*باشد. حال با استفاده از جدول تعداد روز*هاي تقويم ميلادي شروع مي*کنيم از 187 کم مي*کنيم و باز هم فراموش نمي*کنيم که سال 2004 ميلادي سال کبيسه است :
    187-31=156
    156-29=127
    127-31=96
    96-30=66
    66-31=35
    35-30=5
    خب تفريق*هاي فوق را تا جايي ادامه مي*دهيم که عدد به دست آمده کمتر از تعداد روزهاي يک ماه باشند. در بالا 6 مرحله تفريق انجام دهيم به عدد 6 بايد يک بيافزاييم تا تعداد ماه*ها به دست آيد. و عدد ظاهر شده در تفريق آخر نيز برابر عدد روز مي*باشد. پس با محاسبات فوق ديديم که تاريخ 15/4/1383 شمسي برابر 5/7/2004 است.
    اين روش کلي تبديل دو تاريخ به يکديگر است. و براي تبديل انواع تقويم به هم بايد اين مراحل را انجام داد ولي با توجه به نوع تقويم*ها عددهايي که بايد اضافه يا کم بشود طبعا فرق مي*کند.
    موفق باشيد
    برگرفته از سایت vbiran.com
    لایک کردن

  5. #5
    Junior Member
    تاریخ عضویت
    Apr 2016
    نوشته ها
    3

    تابع تبديل ساده ميلادي به شمسي

    سلام دوستان

    من اين فايل رو نوشتم اميدوارم مفيد باشه
    با تشكر
    َAmir Hossein Alinoori
    فایل های پیوست شده فایل های پیوست شده

  6. #6
    Junior Member
    تاریخ عضویت
    Apr 2016
    نوشته ها
    3
    کد:
    int tt=0;
    int sYear=0;
    int sD=0;
    int sMonth=0;
    int sDay=0;
    
    int dWM[12]={0,	31,59,90,120,151,181,212,243,273,304,334};
    int dWKM[12]={0,31,60,91,121,152,182,213,244,274,305,335};
    int IM[12]={31,31,31,31,31,31,30,30,30,30,30,29};
    int IKM[12]={31,31,31,31,31,31,30,30,30,30,30,30};
    void setup() {
      // put your setup code here, to run once:
      Serial.begin(9600);
    
    
    }
    
    void loop() {
      
    Miladitoshamsi(2015, 2, 28);
    Miladitoshamsi(2016, 2, 28);
    Miladitoshamsi(2017, 2, 28);
    Miladitoshamsi(2015, 3, 20);
    Miladitoshamsi(2016, 3, 19);
    Miladitoshamsi(2017, 3, 20);
    Miladitoshamsi(2015, 3, 21);
    Miladitoshamsi(2016, 3, 20);
    Miladitoshamsi(2017, 3, 21);
    Miladitoshamsi(2015, 9, 22);
    Miladitoshamsi(2016, 9, 21);
    Miladitoshamsi(2017, 9, 22);
    Miladitoshamsi(2015, 9, 23);
    Miladitoshamsi(2016, 9, 22);
    Miladitoshamsi(2017, 9, 23);
    Miladitoshamsi(2015, 12, 23);
    Miladitoshamsi(2016, 12, 22);
    Miladitoshamsi(2017, 12, 23);
    
                                  
                                  
    
    
    
    delay (50000);
    
    }
    
          void  Miladitoshamsi(int iYear, int iMonth, int iDay) {
            
                                             Serial.println("iyear= ");
                                     Serial.println(iYear);
    
                                     Serial.println("iMonth= ");
                                     Serial.println( iMonth);
    
                                     Serial.println("iDay= ");
                                     Serial.println(iDay);
       
                                  
                                  if(iYear==((iYear/4)*4) ){
     
                                                              if((iMonth>2&iDay>19)|| iMonth>3){
                                                                 sYear=iYear-621;
                                                                 tt=dWKM[iMonth-1]+iDay-80;
                                                                   
    
                                                                }
                                                                else
                                                                {
                                                                  sYear=iYear-622;
                                                                 tt=dWKM[iMonth-1]+iDay+285;
                                      
                                                                                                    }
                                                                          }
                                        else
                                        {
                                          //  tt=(iYear/4)+(iYear*365)+(dWM[(iMonth-1)]+iDay); 
        
          
                            if((iMonth>2&iDay>20)|| iMonth>3){
                               sYear=iYear-621;
                                tt=dWM[iMonth-1]+iDay-80;
    
                              }
                              else
                              {
                                sYear=iYear-622;
                               tt=dWM[iMonth-1]+iDay+285;
    
                              }
                          
                      }
                      Serial.println("tt=");
                      Serial.println(tt);
                      
                      
                       sD=tt;
                       if( sD> 185){
                        
                       sMonth=7+((sD-186)/30);
                       sDay=sD-(185+(((sD-186)/30)*30));
                                                     
                                                      if((iYear-1)==(((iYear-1)/4)*4) & iMonth<4){
                                                        sD=sD;
                                                         sMonth=7+((sD-186)/30);
                                                         sDay=1+sD-(185+(((sD-186)/30)*30));
                                                      
                                                      }
                                                      
                      
                      
                      
                      }
                     if( sD< 186){
                      
                    sMonth=((sD)/31)+1;
                    sDay=(1+sD-((sMonth-1)*31));
                    
                    
                    }
                    String stringOne=String(sYear)+"/"+String(sMonth)+"/"+String(sDay);
                    
                    
                                                     Serial.println("Shamsi=   ");
                    
                    Serial.print(stringOne);
    
                                                     Serial.println("  ");
                                                     
                                                     
                                                     delay (500);
                    
                            
                            
                            
            
          }

  7. #7
    مدیر گروه
    تاریخ عضویت
    Nov 2013
    محل سکونت
    ایران
    نوشته ها
    4,024
    نقل قول نوشته اصلی توسط iutstudent7@yahoo.com نمایش پست ها
    سلام دوستان

    من اين فايل رو نوشتم اميدوارم مفيد باشه
    با تشكر
    َAmir Hossein Alinoori
    با تسکر فراوان از شما و روحیه کمک رسانی شما

  8. #8
    Senior Member
    تاریخ عضویت
    Oct 2016
    نوشته ها
    112
    نقل قول نوشته اصلی توسط magmagmary نمایش پست ها
    با تسکر فراوان از شما و روحیه کمک رسانی شما
    دمت گرم که درست کار نمیکنه .این چیه اخه
    یک ماه دوروز بیشتر میزنه

  9. #9
    Senior Member
    تاریخ عضویت
    Oct 2016
    نوشته ها
    112
    int tt=0;
    int sYear=0;
    int sD=0;
    int sMonth=0;
    int sDay=0;
    int dWM[12]={0, 31,59,90,120,151,181,212,243,273,304,334};
    int dWKM[12]={0,31,60,91,121,152,182,213,244,274,305,335};
    int IM[12]={31,31,31,31,31,31,30,30,30,30,30,29};
    int IKM[12]={31,31,31,31,31,31,30,30,30,30,30,30};
    void setup() {
    // put your setup code here, to run once:
    Serial.begin(9600);
    }
    void loop() {
    Miladitoshamsi(2015, 2, 28);
    Miladitoshamsi(2016, 2, 28);
    Miladitoshamsi(2017, 2, 28);
    Miladitoshamsi(2015, 3, 20);
    Miladitoshamsi(2016, 3, 19);
    Miladitoshamsi(2017, 3, 20);
    Miladitoshamsi(2015, 3, 21);
    Miladitoshamsi(2016, 3, 20);
    Miladitoshamsi(2017, 3, 21);
    Miladitoshamsi(2015, 9, 22);
    Miladitoshamsi(2016, 9, 21);
    Miladitoshamsi(2017, 9, 22);
    Miladitoshamsi(2015, 9, 23);
    Miladitoshamsi(2016, 9, 22);
    Miladitoshamsi(2017, 9, 23);
    Miladitoshamsi(2015, 12, 23);
    Miladitoshamsi(2016, 12, 22);
    Miladitoshamsi(2017, 12, 23);
    delay (50000);
    }
    void Miladitoshamsi(int iYear, int iMonth, int iDay) {
    Serial.println("iyear= ");
    Serial.println(iYear);
    Serial.println("iMonth= ");
    Serial.println( iMonth);
    Serial.println("iDay= ");
    Serial.println(iDay);

    if(iYear==((iYear/4)*4) ){

    if((iMonth>2&iDay>19)|| iMonth>3){
    sYear=iYear-621;
    tt=dWKM[iMonth-1]+iDay-80;
    }
    else
    {
    sYear=iYear-622;
    tt=dWKM[iMonth-1]+iDay+285;
    }
    }
    else
    {
    // tt=(iYear/4)+(iYear*365)+(dWM[(iMonth-1)]+iDay);
    if((iMonth>2&iDay>20)|| iMonth>3){
    sYear=iYear-621;
    tt=dWM[iMonth-1]+iDay-80;
    }
    else
    {
    sYear=iYear-622;
    tt=dWM[iMonth-1]+iDay+285;
    }
    }
    Serial.println("tt=");
    Serial.println(tt);
    sD=tt;
    if( sD> 185){
    sMonth=7+((sD-186)/30);
    sDay=sD-(185+(((sD-186)/30)*30));
    if((iYear-1)==(((iYear-1)/4)*4) & iMonth<4){
    sD=sD;
    sMonth=7+((sD-186)/30);
    sDay=1+sD-(185+(((sD-186)/30)*30));
    }
    }
    if( sD< 186){
    sMonth=((sD)/31)+1;
    sDay=(1+sD-((sMonth-1)*31));
    }
    String stringOne=String(sYear)+"/"+String(sMonth)+"/"+String(sDay);
    Serial.println("Shamsi= ");
    Serial.print(stringOne);
    Serial.println(" ");
    delay (500);
    }
    تصحیح کن عزیز
    لایک کردن

  10. #10
    Junior Member
    تاریخ عضویت
    Aug 2016
    نوشته ها
    20
    سلام. ببخشید من برعکس این موضوع رو میخواهم.یعنی تبدیل شمسی به میلادی

صفحه 1 از 2 12 آخرینآخرین

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •  

SEO by vBSEO