نمایش نتایج 1 تا 21 از 21

نام تاپیک: کسی الگوریتم تبدیل تقویم میلادی به شمسی را دارد ؟

  1. #1
    فارسی ساز
    مهمان

    Tick کسی الگوریتم تبدیل تقویم میلادی به شمسی را دارد ؟

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

    با تشکر

  2. #2
    کاربر دائمی
    تاریخ عضویت
    مرداد 1382
    محل زندگی
    تهران
    پست
    484
    اگر متن پاسکال به دردت می‌خوره این متن زیر رایگان هست.
    http://delphiarea.com/products/misc/solar.zip

  3. #3
    با عرض ادب:
    در قسمت جاوا همین سایت هم نسخه جاوای این تبدیل موجود است.

    یه عشق برنامه نویسی خفن

  4. #4
    سلام رفقا
    قابل توجه تمام کسانی که می خواهند مبدل تاریخ درست و حسابی بنویسند (یعنی تبدیل تاریخ کامل نه برای 10 و 15 سال)
    1.طبق قانون هیچ روش معینی برای محاسبه کبیسه ها در تقویم جلالی وجود ندارد!
    2.طبق نظر علمای گاهشماری ایران حد اقل سه روش برای گاهشماری جلالی وجود دارد
    روش آقای ایرج ملکپور
    روش استاد دکتر بیرجندی
    روش استفاده از طول متوسط سال
    خوب متاسفانه روش آقای ملکپور مبتنی بر رصد است !
    روش دکتر بیرجندی بسیار نزدیک به روش سوم است ولی با کمی اختلاف در کبیسه های پنج ساله
    روش استفاده از طول سال متوسط هم که قابل استفاده در برنامه سازی است توسط نویسنده کتاب "گاهشماری ایرانی"(اکرمی، موسی) پیشنهاد شده که نمونه پیاده سازی آن در بخش جاوا وجود دارد.
    نکته مهم اینست که این سه روش نتایج متفاوتی را ایجاد می کنند در نتیجه هیچ برنامه نویسی نمی تواند ادعا کند که مبدل درستی نوشته چون اصولا بر طبق ملاک قانونی هیچ روش قابل محاسبه ای تعیین نشده است.

  5. #5
    کاربر جدید
    تاریخ عضویت
    آبان 1382
    محل زندگی
    Iran
    پست
    20
    با پوزش فراوان بابت تاخیر در ارسال :oops:

    Public Function FDate( ) As Long
    On Error Resume Next
    Dim YearEqual(2,2) As Integer
    Dim AddOneDay As Boolean
    Dim AddFarDay As Boolean
    Dim AddToDays As Byte,FarDay As Byte
    Dim ThisDay As Byte
    Dim ThisMonth As Byte
    Dim ThisYear As Integer
    Dim YearDif1 As Integer , YearDif2 As Integer
    Dim TestRange1 As Integer , TestRange2 As Integer
    Dim p As Integer
    Dim CurM As String , CurD As String
    Dim sYear As As Variant , sMonth As Variant , sDay As Variant
    Rem --------
    YearEqual(1,1) = 1997
    YearEqual(1,2) = 1998
    YearEqual(2,1) = 1376
    YearEqual(2,2) = 1377
    ThisDay = Day(Date)
    ThisMonth = Month(Date)
    ThisYear = Year(Date)
    YearDif1 = ThisYear - 1997
    YearDif2 = ThisYear - 1998
    TestRange1 = 1996 - (100 * 4)
    TestRange2 = 1996 + (100 * 4)
    FarsiRange1 = 1375 - (100 * 4)
    FarsiRange2 = 1375 + (100 * 4)
    AddOneDay = False
    Rem -----------
    For p = TestRange1 To TestRange2 Step 4
    If ThisYear = p Then
    AddOneDay = True
    Exit For
    End If
    Next
    If AddOneDay Then AddToDays = 1 Else
    AddToDays = 0
    Rem ------------
    If ((ThisMonth = 3 And ThisDay < 20 + AddToDays) Or (ThisMonth < 3)) Then
    YearDif1 = YearDif1 - 1
    End If
    Rem ------------
    If (ThisYear Mod 2 <> 0 And ((ThisMonth = 3 And ThisDay > (20 - AddToDays)) Or (ThisMonth > 4))) Then
    CurrentYear = YearEqual(2,1) + YearDif1
    Else
    CurrentYear = YearEqual(2,1) + YearDif2
    For p = FarsiRange1 To FarsiRange2 Step 4
    If CurrentYear = p Then AddFarDay = True :
    Exit For
    Next p
    If AddFarDay Then FarDay = 1 Else FarDay = 0
    If (( ThisMonth = 3 And ThisDay > 20 - (AddToDays) + FarDay) Or ThisMonth > 3)
    Then CurrentYear = CurrentYear + 1
    End If
    End If
    If AddToDays = 1 Then FarDay = 0
    Rem ------------
    Select Case ThisMonth
    Case 1
    If ThisDay < (21 - FarDay) Then
    CurrentMonth = 10
    CurrentDay = (ThisDay + 10) + FarDay
    Else
    CurrentMonth = 11
    CurrentDay = (ThisDay - 20) + FarDay
    End If
    Case 2
    If ThisDay < (20 - FarDay) Then
    CurrentMonth = 11
    CurrentDay = (ThisDay + 11) FarDay
    Else
    CurrentMonth = 12
    CurrentDay = (ThisDay - 19) + FarDay
    End If
    Case 3
    If ThisDay < (21 - AddToDays) Then
    CurrentMonth = 12
    CurrentDay = (ThisDay + 9) + AddToDays + FarDay
    Else
    CurrentMobth = 1
    CurrentDay = (ThisDay - 20) + AddToDays
    End If
    Case 4
    If ThisDay < (21 - AddToDays) Then
    CurrentMonth = 1
    CurrentDay = (thisDay + 11) + AddToDays
    Else
    CurrentMonth = 2
    CurrentDay = (ThisDay - 20) + AddToDays
    End If
    Case 5
    If ThisDay < (22 - AddtoDays) then
    CurrentMonth = 2
    CurrentDay = (ThisDay + 10) + AddToDays
    Else
    CurrentMonth = 3
    CurrentDay = (ThisDay - 21) + AddToDays
    End If
    Case 6
    If ThisDay < (22 - AddToDays) Then
    CurrentMonth = 3
    CurrentDay = (ThisDay + 10) + AddToDays
    Else
    CurrentMonth = 4
    CurrentDay = (ThisDay - 21) + AddToDays
    End If
    Case 7
    If ThisDay < (23 - AddToDays) Then
    CurrentMonth = 4
    CurrentDay = (ThisDay + 9) + AddToDays
    Else
    CurrentMonth = 5
    CurrentDay = (ThisDay - 22) + AddToDays
    End If
    Case 8
    If ThisDay < (23 - AddToDays) Then
    CurrentMonth = 5
    CurrentDay = (ThisDay + 9) + AddToDays
    Else
    CurrentMonth = 6
    CurrentDay = (Thisday - 22) + AddToDays
    End If
    Case 9
    If ThisDay < (23 - AddToDays) Then
    CurrentMonth = 6
    CurrentDay = (ThisDay - 22) + AddTodays
    Else
    CurrentMonth=7
    CurrentDay=(ThisDay-22)+AddToDays
    End If
    Case 10
    If ThisDay < (23 - AddToDays) Then
    CurrentMonth = 7
    Currentday = (ThisDay +8 ) + AddToDays
    Else
    CurrentMonth = 8
    CurrentDay = (ThisDay - 22) + AddToDays
    End If
    Case 11
    If ThisDay < (22 - AddToDays) Then
    CurrentMonth = 8
    CurrentDay = (ThisDay + 9) + AddtoDays
    Else
    CurrentMonth = 9
    CurrentDay = (ThisDay - 21) + AddToDays
    End If
    Case 12
    If ThisDay < (22 - AddToDays) Then
    CurrentMonth = 9
    CurrentDay = (ThisDay + 9) + AddToDays
    Else
    CurrentMonth = 10
    CurrentDay = (ThisDay - 21) + AddToDays
    End If
    End Select
    Rem ------------
    CurM = Trim(Str(CurrentMonth))
    CurD = Trim(Str(CurrentDay))
    Rem ------------
    If CurrentMonth < 10 Then CurM = "0" & Trim(Str(CurrentMonth))
    If CurrentDay < 10 Then CurD = "0" & Trim(Str(CurrentDay))
    FDate = Val(Trim(Str((CurrentYear)&#41 ; & CurM & CurD)
    End Function

  6. #6
    کاربر دائمی
    تاریخ عضویت
    آبان 1382
    محل زندگی
    ایران - تهران - تهران پارس
    پست
    237

  7. #7
    ببینید کار میکنه یا نه اخه سریع نوشتم لطفا کامل تست کنید- کد کامل دلفی

    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls;

    type
    TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    ListBox1: TListBox;
    procedure Button1Click(Sender: TObject);
    private
    { Private declarations }
    public
    { Public declarations }
    end;

    var
    Form1: TForm1;
    monthDays: array[1..12] of integer=
    (30,30,29,31,31,31,31,31,31,30,30,30);
    monthNames: array[1..13] of string=
    ('dey','bahman','esfand','farvardin','ordibehe st','khordad','tir','mordad','shahrivar','mehr','a ban','azar','dey');

    procedure printdate(yr,dy: integer);

    implementation

    uses DateUtils;

    {$R *.dfm}

    procedure TForm1.Button1Click(Sender: TObject);
    var
    td: TDate;
    yr,dy: word;
    begin

    td:= StrToDate(Edit1.Text);
    DecodeDateDay(td,yr,dy);
    printdate(yr,dy);

    end;

    procedure printdate(yr,dy: integer);
    var
    s,days,i, Base: integer;
    sal,mah,roz: string;
    begin
    Base:=10;
    monthDays[3]:=29;
    s:=yr-622;
    if yr mod 4 = 1 then inc(Base);
    if s mod 4 = 3 then monthDays[3]:=30;
    days:= dy+Base;

    for i:=1 to 12 do
    begin
    if days<= monthDays[i] then break;
    days:=days-monthdays[i];
    end;

    mah:=monthNames[i];
    roz:=variant(days);
    if i>3 then inc(s);
    sal:=variant(s);
    Form1.ListBox1.Items.Add(sal+' '+mah+' '+roz);
    end;

    end.

  8. #8
    سورسی که در این کنترل دات نت وجود داره هم دقیقه. الگوریتم کلی، مربوط به محاسبهٔ دوره‌های سی و چندساله و صد و چندساله‌ای هست که کبیسهٔ ما به‌جای ۴ سال یکبار، می‌شه ۵ سال یکبار. کتابی هم در این زمینه دارم، اگر مایلید معرفی کنم.

  9. #9
    عنوان = گاهنامهٔ تطبیقی سه هزار ساله
    مولف = احمد بیرشک (که احتمالاً معرف حضور هستند این استاد!)
    ناشر = بنیاد دانشنامهٔ بزرگ فارسی
    چاپ دوم سال ۱۳۷۳

    از جمله صحبت‌های جالبی که در این کتاب می‌خوانید:
    - مفاهیمی مثل کبیسه ۱۲۸ ساله و ...
    - فرمول و جداول لازم برای تبدیل تاریخ ۱۲۶۰ تا ۲۰۰۰ ایرانی و ۱- تا ۲۰۶۲ قمری و ۶۳۹- تا ۲۶۲۱ میلادی به هم‌دیگر!
    - اندکی درباره آن ۱۰ روزی که از تقویم میلادی حذف شد و هیچ معادلی در تاریخ شمسی و قمری ندارد!!
    - این که چرا تقویم ایرانی (جلالی) دقیق‌ترین تقویم است، و با این وجود، هر ۱۴۱۰۰۰ سال یک روز با واقعیت اختلاف پیدا می‌کند!

  10. #10
    کاربر دائمی آواتار tthenry14plus
    تاریخ عضویت
    مرداد 1386
    محل زندگی
    Tehran
    پست
    218
    الگوریتمش زیاد پیچیده نیست
    الگوریتمو بدونی راحت می تونی بنویسیش
    هم کد و هم قطعه برنامه رو می ذارم اگر هم سوالی داشتی به ایمیلم بزن
    mostafa.bita@gmail.com

    bool MiladiIsLeap(int miladiYear)
    {
    if(((miladiYear % 100)!= 0 && (miladiYear % 4) == 0) || ((miladiYear % 100)== 0 && (miladiYear % 400) == 0))
    returntrue;
    else
    returnfalse;
    }
    //***************************************
    void MiladiToShamsi(int iMiladiMonth,int iMiladiDay,int iMiladiYear)
    {

    int shamsiDay, shamsiMonth, shamsiYear;
    int dayCount, farvardinDayDiff, deyDayDiff;
    int[] sumDayMiladiMonth = newint[]{0,31,59,90,120,151,181,212,243,273,304,334};
    int[] sumDayMiladiMonthLeap=newint[]{0,31,60,91,121,152,182,213,244,274,305,335};


    farvardinDayDiff=79;
    if (MiladiIsLeap(iMiladiYear))
    {
    dayCount = sumDayMiladiMonthLeap[iMiladiMonth-1] + iMiladiDay;
    }
    else
    {
    dayCount = sumDayMiladiMonth[iMiladiMonth-1] + iMiladiDay;
    }
    if((MiladiIsLeap(iMiladiYear - 1)))
    {
    deyDayDiff = 11;
    }
    else
    {
    deyDayDiff = 10;
    }
    if (dayCount > farvardinDayDiff)
    {
    dayCount = dayCount - farvardinDayDiff;
    if (dayCount <= 186)
    {
    switch (dayCount%31)
    {
    case 0:
    shamsiMonth = dayCount / 31;
    shamsiDay = 31;
    break;
    default:
    shamsiMonth = (dayCount / 31) + 1;
    shamsiDay = (dayCount%31);
    break;
    }
    shamsiYear = iMiladiYear - 621;
    }
    else
    {
    dayCount = dayCount - 186;
    switch (dayCount%30)
    {
    case 0:
    shamsiMonth = (dayCount / 30) + 6;
    shamsiDay = 30;
    break;
    default:
    shamsiMonth = (dayCount / 30) + 7;
    shamsiDay = (dayCount%30);
    break;
    }
    shamsiYear = iMiladiYear - 621;
    }
    }
    else
    {
    dayCount = dayCount + deyDayDiff;

    switch (dayCount%30)
    {
    case 0 :
    shamsiMonth = (dayCount / 30) + 9;
    shamsiDay = 30;
    break;
    default:
    shamsiMonth = (dayCount / 30) + 10;
    shamsiDay = (dayCount%30);
    break;
    }
    shamsiYear = iMiladiYear - 622;

    }

  11. #11
    کاربر دائمی آواتار tthenry14plus
    تاریخ عضویت
    مرداد 1386
    محل زندگی
    Tehran
    پست
    218

    الگوریتمش

    اینم از الگوریتم تبدیل تاریخ میلادی به تاریخ شمسی :
    تبدیل تاریخ میلادی به شمسی بسیار راحتتر از تبدیل تاریخ شمسی به میلادی است.

    برای نوشتن این الگوریتم به اختلاف روزهای میان اولین روز سال میلادی و اولین روز سال شمسی نیاز داریم که این اختلاف روز(در صورتی که سال کبیسه باشد یا نباشد) "79" روز است.

    برای تشخیص کبیسه بودن یا نبودن سال از روش زیر استفاده می کنیم:
    اگر سال داده شده بر100و400 بخشپذیر باشد" یا بر" 100 بخشپذیر نباشد بر 4 بخشپذیر باشد" آنگاه سال کبیسه است، در غیر این صورت سال کبیسه نیست.
    با توجه به کبیسه بودن یا کبیسه نبودن سال مشخص می کنیم که در کدامین روز سال میلادی قرار داریم.

    دو حالت پیش می آید:

    روزی که در آن قرار داریم از 79 بیشتر است
    به این معنی است که در ماههای بعد از فروردین قرار داریم.
    حال باید مشخص کنیم که در 6 ماه اول سال شمسی قرار داریم یا در 6 ماه دوم سال قرار داریم،
    برای اینکار ابتدا 79 روز از تعداد روزها کم می کنیم تا در اول فروردین قرار بگیریم حال اگر تعداد روزها از "186"(31*6) کمتر باشد یعنی در 6 ماه اول سال شمسی قرار داریم در غیر اینصورت در 6 ماه دوم قرار داریم.

    اگر در 6 ماه اول سال قرار گرفته باشیم :تعداد روزها را بر "31" تقسیم می کنیم(6 ماه اول در سال شمسی 31 روزه است.)
    اگر باقیمانده این تقسیم صفر شد خارج قسمت تقسیم برابر با ماه شمسی می شود و روز شمسی برابر با 31 می شود.
    اگر باقیمانده صفر نشود ماه شمسی برابر با خارج قسمت باضافه یک می شود و روز شمسی همان باقیمانده است.

    اگر در 6 ماه دوم سال قرار گرفته باشیم : "186" روز از تعداد روزها کم می کنیم و آن را بر "30" تقسیم می کنیم .
    اگرباقیمانده این تقسیم صفر شد خارج قسمت تقسیم باضافه"6" برابر با ماه شمسی می شودو روز شمسی برابر با30 می شود.
    اگر باقیمانده صفر نشود ماه شمسی برابر با خارج قسمت باضافه"7" می شودو روز شمسی همان باقیمانده است.

    سال شمسی از تفاضل سال میلادی با"621" بدست می آید.

    روزی که در آن قرار داریم کمتر از"79"است

    که این به این معنی است که درروزهایی بین اولین روزسال میلادی تا اولین روز شمسی (ماههای دی ،بهمن و اسفند)قرار داریم.
    اختلاف روز بین اولین روز سال میلادی داده شده و اولین روز دی ماه در سال شمسی را در نظر می گیریم که این اختلاف برای سال کبیسه"11" و برای غیر کبیسه "10" است.*دقت کنید که در این الگوریتم برای مشخص کردن این اختلاف باید سال قبل از سال داده شده را در نظر بگیریم زیرا سال قبل بر روی اولین روز سال میلادی تاثیر می گزارد.*

    اختلاف روز با تعداد روز محاسبه شده جمع می کنیم ، آن را بر"30" تقسیم می کنیم(3 ماه آخر سال شمسی 30 روزه است.).
    اگر باقیمانده این تقسیم صفر شود خارج قسمت تقسیم باضافه"9" برابر با ماه شمسی می شودو روز شمسی برابر با"30" می شود.
    اگر باقیمانده صفر نشود ماه شمسی برابر با خارج قسمت باضافه"10"می شودو روز شمسی همان باقیمانده است.

    در این حالت سال شمسی از تفاضل سال میلادی با"622" بدست می آید.(زیرا در سال قبل قرار داریم.)

  12. #12
    کاربر دائمی آواتار reza6384
    تاریخ عضویت
    آبان 1386
    محل زندگی
    تهران - شهرک ژاندارمری
    سن
    40
    پست
    740
    برای تشخیص کبیسه بودن یا نبودن سال از روش زیر استفاده می کنیم:
    اگر سال داده شده بر100و400 بخشپذیر باشد" یا بر" 100 بخشپذیر نباشد بر 4 بخشپذیر باشد" آنگاه سال کبیسه است، در غیر این صورت سال کبیسه نیست.
    با توجه به کبیسه بودن یا کبیسه نبودن سال مشخص می کنیم که در کدامین روز سال میلادی قرار داریم.

    هر عدد که به 4 بخش پذر باشه توی شرط بالا صدق می کنه. و بخش پذیر بودن به 4 شرط کبیسه بودن سال نیست. یک سال شمسی کبیسه هست وقتی باقیمانده اون به 33 یکی از اعداد 6، 22، 17، 13، 9، 5، 1 و 30 باشه.
    البته من خودم از این الگوریتم برای تبدیل استفاده کردم و غیر از کبیسه بودن سال که متدشو عوض کردم مشکل دیگه ای نداره.

  13. #13
    سلام
    اگه از NET. استفاده می کنید که خودش به هر نوع تاریخی که بخواهید تبدیل می کنه . دیگه احتیاجی به کد نویسی نیست . کافی از using system.globalization استفاده کنید .
    من کد delphi , c دارم اگه خواستید بگید ، واستون بزارم .

  14. #14
    مدیر بخش آواتار whitehat
    تاریخ عضویت
    مهر 1382
    محل زندگی
    شیراز
    پست
    2,175
    اگه از NET. استفاده می کنید که خودش به هر نوع تاریخی که بخواهید تبدیل می کنه . دیگه احتیاجی به کد نویسی نیست . کافی از using system.globalization استفاده کنید .
    من کد delphi , c دارم اگه خواستید بگید ، واستون بزارم .
    ما سعی می کنیم در این بخش مستقل از زبان عمل کنیم، بهتره اگه کد یا شبه کدی دارید در اینجا قرار دهید. در ضمن این امکان در دات نت نسخه 2 پشتیبانی میشه و نسخه های قدیمی این امکان را ندارند
    موفق باشید
    To follow the path:
    Look to the master
    Follow the master
    Walk with the master
    See through the master
    Become the master

  15. #15
    کد تبدیل با C :


    #include <stdio.h>
    #include <conio.h>
    #include <dos.h>
    main()
    {
    //start/variables
    int m_day_mon[12] = {31,0,31,30,31,30,31,31,30,31,30,31};
    int s_day_mon[12] = {31,31,31,31,31,31,30,30,30,30,30,30};

    int m_year , s_year;
    int m_month , s_month;
    int m_day , s_day;
    int m_day_sum , s_day_sum;
    //end/variables
    struct date d;
    getdate(&d);
    m_year = d.da_year;
    m_month = d.da_mon;
    m_day = d.da_day;
    // number of past day from m_year
    if(m_year % 4 == 0)
    m_day_mon[1] = 29;
    else m_day_mon[1] = 28;
    for(int i = 1 ; i <m_month ; i++)
    m_day_sum += m_day_mon[i - 1];
    m_day_sum += m_day;
    // convert m_date to s_date
    if(m_day_sum > 79)
    {
    s_day_sum = m_day_sum - 79;
    s_year = m_year - 621; //s_year
    if((s_year + 1) % 4 == 0)
    s_day_mon[11] = 30;
    else s_day_mon[11] = 29;
    if (s_day_sum > 186)
    {
    s_month = ((s_day_sum - 187) / 30) + 7;
    s_day = (s_day_sum - 186) % 30;
    if(s_day == 0) s_day = 30;
    }
    else
    {
    s_month = ((s_day_sum - 1) /31) + 1;
    if(s_month == 0) s_month = 1;
    s_day = s_day_sum % 31;
    if(s_day == 0) s_day = 31;
    }
    }
    else
    {
    s_year = m_year - 622;
    if((s_year + 1) % 4 == 0)
    {
    s_day_mon[11] = 30;
    s_day_sum = m_day_sum + 287;
    }
    else
    {
    s_day_mon[11] = 29;
    s_day_sum = m_day_sum + 286;
    }
    s_month = ((s_day_sum -187) / 30) + 7;
    s_day = (s_day_sum - 186) % 30;
    if(s_day == 0) s_day = 30;
    }
    printf("TODAY IN GREGORIAN CALENDAR IS : %d/%d/%d\n" , m_year,m_month,m_day);
    if((m_month == 1) && (m_day == 1))
    printf("HAPPY NEW GREGORIAN YEAR\n");
    printf("\nTODAY IN PERSIAN CALENDAR IS : %d/%d/%d\n" , s_year,s_month,s_day);
    if((s_month == 1) && (s_day == 1))
    printf("HAPPY NEW PERSIAN YEAR");
    getch();
    }

  16. #16

    نقل قول: کسی الگوریتم تبدیل تقویم میلادی به شمسی را دارد ؟

    نقل قول نوشته شده توسط reza6384 مشاهده تاپیک
    هر عدد که به 4 بخش پذر باشه توی شرط بالا صدق می کنه. و بخش پذیر بودن به 4 شرط کبیسه بودن سال نیست. یک سال شمسی کبیسه هست وقتی باقیمانده اون به 33 یکی از اعداد 6، 22، 17، 13، 9، 5، 1 و 30 باشه.
    البته من خودم از این الگوریتم برای تبدیل استفاده کردم و غیر از کبیسه بودن سال که متدشو عوض کردم مشکل دیگه ای نداره.
    سلام.
    اين روشي كه شما فرموديد، درست كار نمي كنه، چون سال 1379 كبيسه هست ولي باقيمانده آن به 33 برابر است با : 26 كه اين عدد جز باقيمانده هاي بالا نيست!!
    راه ديگه اينه كه يك سال کبیسه رو به عنوان سال مبنا قرار بدي ، مثلا 1387، و بعد اگر اختلاف هر سال دلخواهي با اين سال مبنا ، بر 4 بخش پذير بود، اون سال کبیسه خواهد بود.
    نكته مهم اين كه اين ايده ي دوست عزيزم ، montazer_mosleh هست. كه كاملا درست جواب مي ده.

  17. #17

    نقل قول: کسی الگوریتم تبدیل تقویم میلادی به شمسی را دارد ؟

    نقل قول نوشته شده توسط ahmadkiani مشاهده تاپیک
    کد تبدیل با C :


    #include <stdio.h>
    #include <conio.h>
    #include <dos.h>
    main()
    {
    //start/variables
    int m_day_mon[12] = {31,0,31,30,31,30,31,31,30,31,30,31};
    int s_day_mon[12] = {31,31,31,31,31,31,30,30,30,30,30,30};

    int m_year , s_year;
    int m_month , s_month;
    int m_day , s_day;
    int m_day_sum , s_day_sum;
    //end/variables
    struct date d;
    getdate(&d);
    m_year = d.da_year;
    m_month = d.da_mon;
    m_day = d.da_day;
    // number of past day from m_year
    if(m_year % 4 == 0)
    m_day_mon[1] = 29;
    else m_day_mon[1] = 28;
    for(int i = 1 ; i <m_month ; i++)
    m_day_sum += m_day_mon[i - 1];
    m_day_sum += m_day;
    // convert m_date to s_date
    if(m_day_sum > 79)
    {
    s_day_sum = m_day_sum - 79;
    s_year = m_year - 621; //s_year
    if((s_year + 1) % 4 == 0)
    s_day_mon[11] = 30;
    else s_day_mon[11] = 29;
    if (s_day_sum > 186)
    {
    s_month = ((s_day_sum - 187) / 30) + 7;
    s_day = (s_day_sum - 186) % 30;
    if(s_day == 0) s_day = 30;
    }
    else
    {
    s_month = ((s_day_sum - 1) /31) + 1;
    if(s_month == 0) s_month = 1;
    s_day = s_day_sum % 31;
    if(s_day == 0) s_day = 31;
    }
    }
    else
    {
    s_year = m_year - 622;
    if((s_year + 1) % 4 == 0)
    {
    s_day_mon[11] = 30;
    s_day_sum = m_day_sum + 287;
    }
    else
    {
    s_day_mon[11] = 29;
    s_day_sum = m_day_sum + 286;
    }
    s_month = ((s_day_sum -187) / 30) + 7;
    s_day = (s_day_sum - 186) % 30;
    if(s_day == 0) s_day = 30;
    }
    printf("TODAY IN GREGORIAN CALENDAR IS : %d/%d/%d\n" , m_year,m_month,m_day);
    if((m_month == 1) && (m_day == 1))
    printf("HAPPY NEW GREGORIAN YEAR\n");
    printf("\nTODAY IN PERSIAN CALENDAR IS : %d/%d/%d\n" , s_year,s_month,s_day);
    if((s_month == 1) && (s_day == 1))
    printf("HAPPY NEW PERSIAN YEAR");
    getch();
    }
    سلام به همه ی اساتید
    کسی کد تبدیل به قمری رو نداره c مثل بالا دقیقا
    ممنون

  18. #18

    نقل قول: کسی الگوریتم تبدیل تقویم میلادی به شمسی را دارد ؟

    كسي نيست جواب مارو بده؟

  19. #19

    Lightbulb تبدیل تقویم میلادی به شمسی در MySQL (مسعود)

    DELIMITER ;;
    CREATE DEFINER=`root`@`localhost` FUNCTION `gday`(x int) RETURNS int(11)
    begin
    declare y int;
    case x
    when 0 then set y = 31;
    when 1 then set y = 28;
    when 2 then set y = 31;
    when 3 then set y = 30;
    when 4 then set y = 31;
    when 5 then set y = 30;
    when 6 then set y = 31;
    when 7 then set y = 31;
    when 8 then set y = 30;
    when 9 then set y = 31;
    when 10 then set y = 30;
    when 11 then set y = 31;
    else set y = 0;
    end case;
    return y;
    end;;
    DELIMITER ;

    -- ----------------------------
    -- Function structure for GeoToJal
    -- ----------------------------
    DELIMITER ;;
    CREATE DEFINER=`root`@`localhost` FUNCTION `GeoToJal`(jdate datetime) RETURNS varchar(32) CHARSET utf8
    begin
    declare g_y int;
    declare g_m int;
    declare g_d int;
    declare gy int;
    declare gm int;
    declare gd int;
    declare jy int;
    declare jm int;
    declare jd int;
    declare g_day_no int;
    declare j_day_no int;
    declare j_np int;
    declare i int;

    set g_y = year(jdate);
    set g_m = month(jdate);
    set g_d = day(jdate);

    if g_y = 0 || g_m = 0 || g_d = 0 then
    return null;
    end if;

    set gy = g_y - 1600;
    set gm = g_m - 1;
    set gd = g_d - 1;

    set g_day_no = 365*gy+((gy+3) div 4)-((gy+99) div 100)+((gy+399) div 400);

    set i = 0;
    _loop1: LOOP
    set g_day_no = g_day_no + gday(i);

    set i = i + 1;
    if i = gm then
    leave _loop1;
    end if;
    end LOOP _loop1;

    if gm>1 && ((mod(gy,4)=0 && not (mod(gy,100)=0)) || (mod(gy,400)=0)) then
    set g_day_no = g_day_no + 1;
    end if;

    set g_day_no = g_day_no + gd;
    set j_day_no = g_day_no - 79;
    set j_np = j_day_no div 12053;
    set j_day_no = mod(j_day_no, 12053);
    set jy = 979 + 33 * j_np + 4 * (j_day_no div 1461);
    set j_day_no = mod(j_day_no, 1461);

    if j_day_no >= 366 then
    set jy = jy + ((j_day_no-1) div 365);
    set j_day_no = mod((j_day_no-1), 365);
    end if;

    set i = 0;
    _loop2: LOOP
    set j_day_no = j_day_no - jday(i);

    set i = i + 1;
    if i >= 11 || j_day_no < jday(i) then
    leave _loop2;
    end if;
    end LOOP _loop2;

    set jm = i + 1;
    set jd = j_day_no + 1;

    return concat(jy, "/", jm, "/", jd, " ", time(jdate));
    end;;
    DELIMITER ;

    -- ----------------------------
    -- Function structure for jday
    -- ----------------------------
    DELIMITER ;;
    CREATE DEFINER=`root`@`localhost` FUNCTION `jday`(x int) RETURNS int(11)
    begin
    declare y int;
    case x
    when 0 then set y = 31;
    when 1 then set y = 31;
    when 2 then set y = 31;
    when 3 then set y = 31;
    when 4 then set y = 31;
    when 5 then set y = 31;
    when 6 then set y = 30;
    when 7 then set y = 30;
    when 8 then set y = 30;
    when 9 then set y = 30;
    when 10 then set y = 30;
    when 11 then set y = 29;
    else set y = 0;
    end case;
    return y;
    end;;
    DELIMITER ;
    #END





  20. #20
    کاربر جدید آواتار saya joon
    تاریخ عضویت
    مهر 1390
    محل زندگی
    ایران
    سن
    35
    پست
    4

    نقل قول: کسی الگوریتم تبدیل تقویم میلادی به شمسی را دارد ؟

    نقل قول نوشته شده توسط ahmadkiani مشاهده تاپیک
    سلام
    اگه از NET. استفاده می کنید که خودش به هر نوع تاریخی که بخواهید تبدیل می کنه . دیگه احتیاجی به کد نویسی نیست . کافی از using system.globalization استفاده کنید .
    من کد delphi , c دارم اگه خواستید بگید ، واستون بزارم .
    با سلام.دوست خوب میشه همون کد c گذاشتین اینجا توضیح بدی من مبتدی هستم متوجه نشدم چی به چی هست؟ کد را کامل توضیح بدین ممنون میشم.

  21. #21

    نقل قول: کسی الگوریتم تبدیل تقویم میلادی به شمسی را دارد ؟

    برای نوشتن فلوچارتش باید چه کرد میشه قدم به قدم بگید

قوانین ایجاد تاپیک در تالار

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