# Native Code > برنامه نویسی در Delphi > مباحث عمومی دلفی و پاسکال >  فرمول بدست آوردن ایام هفته

## Saeid59_m

سلام 
دوستان کسی فرمول بدست آوردن ایام هفته را ندارد ؟

1386/5/1         -------->         دوشنبه

----------


## SYNDROME

با سلام



> سلام 
> دوستان کسی فرمول بدست آوردن ایام هفته را ندارد ؟
> 1386/5/1 --------> دوشنبه


1-اول فاصله دو تا تاریخ را به دست بیاور
2-سپس باقی مانده عدد به دست آمده تقسیم بر 7 را به دست بیاور.
3-سپس به عداد روزها باقی مانده به روز مورد نظر اضافه کن.
مثال :تاریخ اول را تاریخ خودت را انتخاب کردم.
تاریخ دوم : 1/6/1386 
1-اختلاف : 31
2-باقی مانده 31 تقسیم بر 7 : 3
3-3 روز به دوشنبه اضافه می کنم :پنج شنبه
موفق باشی

----------


## ghabil

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

----------


## Batman

در ادامه صحبتهای آقای ghabil
بدست آوردن روز هفته dayofweek و استفاده از دستور case 
در ضمن یکشنبه اولین روز هفته هستش
case dayofw
0:sunday;
1:monday;
موفق باشی
...

----------


## Saeid59_m

دوستان من قبلاً فرمولش رو داشتم . ولی حالا دقیق یادم نیست

اینطور بود که هر ماه رو + یک عدد ثابت می کردی و حاصل رو تقسیم بر 7 میکردیم . باقی مانده می شد حاصل . اگه کسی اون جدول رو داره . لطف کنه . ممنون

----------


## Batman

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

----------


## Saeid59_m

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


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

----------


## Batman

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

----------


## علامت سوال

جمعه توی تاریخ میلادی با جمعه توی تاریخ شمسی چه فرقی میکنه؟
هر دو شون توی تقویم یکیه

----------


## vcldeveloper

> جمعه توی تاریخ میلادی با جمعه توی تاریخ شمسی چه فرقی میکنه؟


در تاریخ شمسی جمعه آخر هفته هست و تعطیله، در تاریخ میلادی روز پنجم هفته هست و تعطیل نیست.

----------


## Saeid59_m

> شما تستش کن اگه جواب نداد مشکل رو بگو
> از رو خود تاریخ سیستم (میلادی) به راحتی میشه روز رو پیدا کرد


  من مشکلم تاریخ جاری که نیست . مثلاً می خوام بدونم 1389/8/6 چند شنبه می شه . 
تا ریخ میلادی اون رو هم ندارم .

----------


## SYNDROME

با سلام



> من مشکلم تاریخ جاری که نیست . مثلاً می خوام بدونم 1389/8/6 چند شنبه می شه . 
> تا ریخ میلادی اون رو هم ندارم .


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

----------


## Batman

آقا سعید اینم برنامه نمایش روز در یه تاریخ خاص
استفاده از حلقه for : به دلیل refresh شدن تاریخ
منتها تاریخ فعلی سیسمت رو یه جایی ذخیره کن

----------


## Saeid59_m

> آقا سعید اینم برنامه نمایش روز در یه تاریخ خاص
> استفاده از حلقه for : به دلیل refresh شدن تاریخ
> منتها تاریخ فعلی سیسمت رو یه جایی ذخیره کن


دستت درد نکنه که کمک کردی . ولی برنامه ای که گذاشتی فقط برای تاریخ میلادی درست جواب می ده . برای تاریخ شمسی جواب غلطه . مثلا 1386/05/01 که وارد کردم می نویسه سه شنبه در صورتی که دوشنبه بود .

----------


## علامت سوال

> در تاریخ شمسی جمعه آخر هفته هست و تعطیله، در تاریخ میلادی روز پنجم هفته هست و تعطیل نیست.


آقای کشاورز تا جایی که بنده از سوال ایشون متوجه شدم مشکل تعطیل بودن روزها نیست. مشکل خود روزهای هفته هست.سوال کننده قصدش پیدا کردن روز هفته هست.
در تقویم میلادی و شمسی روز های زیر همیشه معادل هستند و یک روند ثاب هست پس لازم نیست نگران متغیر بودن نتیجه در تاریخ های میلادی و شمسی باشیم
Sat -> شنبه
Sun-> یکشنبه
.
.
.
Fri->جمعه

منظور من این بود...

----------


## علامت سوال

> دستت درد نکنه که کمک کردی . ولی برنامه ای که گذاشتی فقط برای تاریخ میلادی درست جواب می ده . برای تاریخ شمسی جواب غلطه . مثلا 1386/05/01 که وارد کردم می نویسه سه شنبه در صورتی که دوشنبه بود .


سعید جان این برنامه این طور در نظر میگیره که این تاریخ سال 1386 میلادی هست.شما معادل میلادی تاریخت رو به برنامه بده.دوستان قبلا هم متذکر شدند.
در ضمن من قبلا چند تا سورس یا کامپوننت در سایت برای تبدیل تاریخ ها ی میلادی به شمسی و بر عکس دیدم.

----------


## Batman

خوب میتونی یه کار کنی تاریخ شمسی رو به میلادی تبدیل کنی و بعد برنامه ای رو که نوشتم به صورت یه تابع صدا بزن و روز رو به دست بیار همین 
اگه تابع تبدیل رو هم نداری (که حتما داری) بگو تا برات بذارم

----------


## golihaghighi

از این کد می تونید برای تبدیل تاریخ میلادی به شمسی استفاده کنید.


 
    Function Shamsi(Optional ByVal Date1 As String = "", Optional ByVal SmallDate1 As Boolean = False, Optional ByVal Year4Char As Boolean = True) As String
        Dim U, Ym, Rp, D, P, Sd, Ls, Ye, I, Mn, Yy, J, Dd As Integer
        'Dim d, p As Integer()
        Dim w, Mon, Days As String()
        Dim T4, T5, T6 As Integer(,)
        'd = New Integer() {20, 19, 20, 20, 21, 21, 22, 22, 22, 22, 21, 21}
        'p = New Integer() {11, 12, 10, 12, 11, 11, 10, 10, 10, 9, 10, 10}
        w = New String() {"یکشنبه", "دوشنبه", "سه شنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه"}
        T4 = New Integer(,) {{11, 12, 11, 11}, {12, 13, 12, 12}, _
                            {11, 11, 10, 11}, {13, 12, 12, 12}, _
                            {12, 11, 11, 11}, {12, 11, 11, 11}, _
                            {11, 10, 10, 10}, {11, 10, 10, 10}, _
                            {11, 10, 10, 10}, {10, 9, 9, 9}, _
                            {11, 10, 10, 10}, {11, 10, 10, 10}}
        T5 = New Integer(,) {{20, 19, 20, 20}, {19, 18, 19, 19}, _
                            {19, 20, 20, 20}, {19, 20, 20, 20}, _
                            {20, 21, 21, 21}, {21, 21, 21, 21}, _
                            {21, 22, 22, 22}, {21, 22, 22, 22}, _
                            {21, 22, 22, 22}, {21, 22, 22, 22}, _
                            {20, 21, 21, 21}, {20, 21, 21, 21}}
        T6 = New Integer(,) {{10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8, 9}, _
                            {11, 12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}}
        If SmallDate1 = True Then
            Mon = New String() {"01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"}
        Else
            Mon = New String() {"فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند"}
        End If
        If SmallDate1 = True Then
            Days = New String() {"01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", _
                                "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31"}
        Else
            Days = New String() {"یکم", "دوم", "سوم", "چهارم", "پنجم", "ششم", "هفتم", "هشتم", "نهم", "دهم", _
                                "یازدهم", "دوازدهم", "سیزدهم", "چهاردهم", "پانزدهم", "شانزدهم", "هفدهم", "هجدهم", "نوزدهم", "بیستم", _
                                "بیست و یکم", "بیست و دوم", "بیست و سوم", "بیست و چهارم", "بیست و پنجم", "بیست و ششم", "بیست و هفتم", _
                                "بیست و هشتم", "بیست و نهم", "سیم", "سی و یکم"}
        End If
 
        If Date1 = "" Then
            Date1 = Convert.ToString(Date.Now)
        End If
        Yy = Convert.ToDateTime(Date1).Year
        J = Convert.ToDateTime(Date1).Month
        Dd = Convert.ToDateTime(Date1).Day
        U = 0
        Rp = 0
        If KabiseM(Yy) = True Then
            U = 1
        End If
        Ym = Yy - 622
        If KabiseS(Ym) = True Then
            Rp = 1
        End If
        If (Rp = 0 And U = 1) Then
            I = 1
        ElseIf (Rp = 1 And U = 0) Then
            I = 2
        ElseIf (Rp = 0 And U = 0) Then
            I = 3
        Else
            I = 4
        End If
        D = T4(J - 1, I - 1)
        P = T5(J - 1, I - 1)
        If Dd <= P Then
            Sd = D + Dd - 1
            Mn = T6(0, J - 1)
            Ls = 1
        Else
            Sd = Dd - P
            Mn = T6(1, J - 1)
            Ls = 2
        End If
        If (J > 3 Or (Ls = 2 And J = 3)) Then
            Ye = Yy - 621
        Else
            Ye = Yy - 622
        End If
 
        '****************************
        '****************************
        If SmallDate1 = True Then
            If Year4Char = True Then
                Shamsi = Trim(Str(Ye)) + "/" + Trim(Mon(Mn - 1)) + "/" + Trim(Days(Sd - 1))
            Else
                Shamsi = Mid(Trim(Str(Ye)), 3, 2) + "/" + Trim(Mon(Mn - 1)) + "/" + Trim(Days(Sd - 1))
            End If
        Else
            If Year4Char = True Then
                Shamsi = w(Convert.ToDateTime(Date1).DayOfWeek) + " " + Days(Sd - 1) + " " + Mon(Mn - 1) + " " + Str(Ye)
            Else
                Shamsi = w(Convert.ToDateTime(Date1).DayOfWeek) + " " + Days(Sd - 1) + " " + Mon(Mn - 1) + " " + Mid(Trim(Str(Ye)), 3, 2)
            End If
        End If
    End Function
    Function KabiseS(ByVal Year As Integer) As Boolean
        Dim s, kkb, x, w As Integer
        s = (Year + 16) \ 33
        kkb = s * 33 - 16
        If kkb + 1 = Year Then
            KabiseS = False
        Else
            x = (Year + 15) \ 33
            w = Year - x - 17
            If (w Mod 4) = 0 Then
                KabiseS = True
            Else
                KabiseS = False
            End If
        End If
    End Function
    Function KabiseM(ByVal Year As Integer) As Boolean
        If (Year Mod 100) = 0 Then
            If (Year Mod 400) = 0 Then
                KabiseM = True
            Else
                KabiseM = False
            End If
        Else
            If (Year Mod 4) = 0 Then
                KabiseM = True
            Else
                KabiseM = False
            End If
        End If
    End Function

----------


## Batman

با سلام
جناب gholihaghighi عزیز بهتره نبود به جای این همه کد همون برنامه رو آپلود میکردی
موفق باشی

----------


## golihaghighi

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

----------


## dkhatibi

تاریخ میلادی به شمسی و برعکس بارها گفته شده است. من تاریخم را به میلادی تبدیل می کنم و بعد ل=از فرمول گفته شده استفاده می کنم.

----------


## Saeid59_m

دوستان برای این مسئله راه حلهای زیادی ارائه کرده اند . اما خودم تونستم یه تابع بنویسم که تاریخ *شمسی* رو دریافت  کنه و اعداد 0 تا 6 رو بعنوان خروجی ، به صورتی که 0  معرف "شنبه" ، 1 معرف "یکشنبه" و ... و 6 معرف "جمعه" باشد .

امیدوارم مفید باشه .


Function DayOfWeek_Shamsi (y,m,d:integer):integer;
Var
Sum:int64;
Begin

Sum:=y div 4;
sum:=sum+(y*365);

if m<=6 then Sum:=Sum+((m-1)*31)+d else Begin
Sum:=Sum+(6*31)+d;
Sum:=Sum+((m-7)*30);
End;

DayOfWeek_Shamsi:=Sum Mod 7;

End;

----------


## delphi5

> روش درست استفاده از تابع DayOfWeek هست ، ولی اول باید تاریخت رو به میلادی تبدیل کنی بعد بهش بدی.
> حساب کردن اختلاف تقریبا عملی نیست ، مگر اینکه همه پارامترها ، مثل سالهای کبیسه و تعداد روزهای ماههای مختلف رو در نظر بگیری!


 

با سلام 
من از تابع dayofweek استفاده میکنم اما بدرستی جواب نمی گیرم .من تاریخ میلادی رو با استفاده از keyboard وارد میکنم (فرمت DD/MM/YY) .
کسی میتونه این مشکل رو حل کنه ؟



        ADate:=strtodate(trim(dday)+'/'+trim(mmonth)+'/'+copy(trim(myear),3,2));
        with ADOTable1 do
            begin
                Connection:=ADOConnection1;
                TableName:='db_dayofweek';
                ADOConnection1.Connected:=true;
                Active:=true;
                first;
                don:=false;
                don:=Locate('ad'{table field that store number of day like 1,2,...},trim(inttostr(DayOfWeek(ADate))),[Lopartialkey]);
                if don then
                    begin
                         eweek.Caption:=trim(ADOTable1.fieldbyname('ename')  .asstring);
                         fweek.Caption:=trim(ADOTable1.fieldbyname('fname')  .asstring);
                    end;
                First;
                Active:=false;
            end;

----------


## delphi5

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

----------


## masoud.rhb

برنامت اشتباس دادا
1/10/93 میشه دوشنبه این شنبه میده

----------


## یوسف زالی

از توابع این لینک استفاده کنید.

----------


## masoud.rhb

Dim MyCalendar As New System.Globalization.PersianCalendar
Result = Date.Now.ToShortDateString
((((Result = MyCalendar.GetDayOfWeek(New Date(CInt(Result.Split("/")(0)), CInt(Result.Split("/")(1)), CInt(Result.Split("/")(2
        Select Case Result
            Case 6
Result = "شنبه"
            Case 0
Result = "یکشنبه"
            Case 1
Result = "دوشنبه"
            Case 2
Result = "سه شنبه"
            Case 3
Result = "چهارشنبه"
            Case 4
Result = "پنج شنبه"
            Case 5
Result = "جمعه"
        End Select

----------


## دلفــي

يه برنامه اي قبلا در اين زمينه نوشته بودم ، فايل اجراييش رو مي توني از لينك زير دانلود كني 
ببين اگه منظورت همينه كه من نوشتم كدشو برات از آرشيوم بگردم پيدا كنم

http://uplod.ir/xpacvv7ovz4p/Date2Date.zip.htm

----------


## h_mohamadi

دوستان فانکشنی که کاملا جواب می دهد
Function DayOfWeek_Shamsi(Tarikh:String):String;
Var
Sum:int64;
day:String;
y,m,d:integer;
Begin

IF Length(Tarikh)=6 THEN
  begin
   y:=StrToInt(copy(Tarikh,1,2));
   m:=StrToInt(copy(Tarikh,3,2));
   d:=StrToInt(copy(Tarikh,5,2));
  end
    else
      IF Length(Tarikh)=8 THEN
        begin
         y:=StrToInt(copy(Tarikh,1,2));
         m:=StrToInt(copy(Tarikh,4,2));
         d:=StrToInt(copy(Tarikh,7,2));
        end;


Sum:=y div 4;
sum:=sum+(y*365);

if m<=6 then
 Sum:=Sum+((m-1)*31)+d
 else
 Begin
  Sum:=Sum+(6*31)+d;
  Sum:=Sum+((m-7)*30);
 end;

DayOfWeek_Shamsi:=IntToStr(Sum Mod 7);
Case StrToInt(Result) Of
 0:Result:= 'يکشنبه';
 1:Result:='دوشنبه';
 2:Result:='سه شنبه';
 3:Result:='چهارشنبه';
 4:Result:='پنج شنبه';
 5:Result:='جمعه';
 6:Result:='شنبه';
end;

End;

----------


## دلفــي

> دوستان فانکشنی که کاملا جواب می دهد
> Function DayOfWeek_Shamsi(Tarikh:String):String;
> Var
> Sum:int64;
> day:String;
> y,m,d:integer;
> Begin
> 
> IF Length(Tarikh)=6 THEN
> ...


براي تاريخ 13931204 خروجي سه شنبه ميده كه درست نيست !

----------

