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

نام تاپیک: کم کردن دو تاریخ و نتیجه به روز

  1. #1

    کم کردن دو تاریخ و نتیجه به روز

    با سلام و قبولی طاعات و عبادات همه دوستان و عزیزان

    من دو فید دارم که تاریخ را در آنها ذخیره می کنم که ساختار فیلدها text با 10کاراکتر می باشد
    حال میخواهم تاریخ این دو را از هم کم کنم و در فید سوم (به روز )بنویسم
    مثلاً dates:85/07/15 و datef:85/07/16 بود این دو را از هم کم کند و نتیجه datef-dates=1 را به ما بدهد.
    با تشکر از همه عزیزان
    داود

  2. #2
    کاربر دائمی
    تاریخ عضویت
    تیر 1382
    محل زندگی
    ایران-سیرجان
    پست
    273
    سلام
    این تابع رو خودم نوشتم. ببین بدرد می‌خوره؟
     
    function TfrmMain.Duration(y1,m1,d1,y2,m2,d2:Integer):Integ er;
    var
    day:integer;
    begin
    day:=d2-d1;
    if m2>m1 then
    begin
    if m2<7 then
    day:=31-d1+d2+(m2-m1-1)*31;
    if m1>6 then
    day:=30-d1+d2+(m2-m1-1)*30;
    if (m2>6) and (m1<=6) then
    day:=31-d1+(6-m1)*31+(m2-7)*30+d2;
    end;
    if y2>y1 then
    begin
    if y1 mod 4=3 then
    begin
    if (m1<7) and (m2<7) then
    day:=31-d1+(6-m1)*31+180+(m2-1)*31+d2;
    if (m1<7) and (m2>6) then
    day:=31-d1+(6-m1)*31+180+186+(m2-7)*30+d2;
    if (m1>6) and (m2<7) then
    day:=30-d1+(12-m1)*30+(m2-1)*31+d2;
    if (m1>6) and (m2>6) then
    day:=30-d1+(12-m1)*30+186+(m2-7)*30+d2;
    end
    else
    begin
    if (m1<7) and (m2<7) then
    day:=31-d1+(6-m1)*31+179+(m2-1)*31+d2;
    if (m1<7) and (m2>6) then
    day:=31-d1+(6-m1)*31+179+186+(m2-7)*30+d2;
    if (m1>6) and (m2<7) then
    day:=30-d1+(12-m1)*30-1+(m2-1)*31+d2;
    if (m1>6) and (m2>6) then
    day:=30-d1+(12-m1)*30-1+186+(m2-7)*30+d2;
    end
    end;
    result:=day;
    end;


  3. #3
    منم این تابع رو نوشتم که تاریخ رو به عدد تبدیل می کنه .
    البته نامردی اگه این نکته رو نگم که آخر سال دو سه روزی کم و زیاد می شه

    {-------------------------------------------------------------------}
    Function Datetonum (Y,M,D:INT64):INT64;
    Var
    Moon1,Moon2,MoonEnd:INT64;
    Begin
    Moon1:=0;
    Moon2:=0;
    MoonEnd:=0;

    If (M>6) And (M<12) Then Begin
    Moon1:=6*31;
    Moon2:=(M-6)*30;
    End Else Begin
    If (M<>12) Then Moon1:=M*31;
    End;

    If (M=12) Then Begin
    Moon1:=6*31;
    Moon2:=5*30;
    If (Y Mod 4)=3 Then MoonEnd:=30 Else MoonEnd:=29;
    End;

    Datetonum:=(Y*365)+Moon1+Moon2+MoonEnd+D;
    End;
    {-------------------------------------------------------------------}

  4. #4
    با سلام بر دوستان
    ضمن عرض تشکر از شما من فقط می خواهم دو فیلد تاریخ را از هم کم کنم و در فید سوم بنویسم
    ساختار فیلدها نیز text می باشد با 10 کاراکتر
    من برای ورود تاریخ شمسی و ... مشکلی ندارم

    مثال :
    اگر dtae1:85/07/16 و date2:85/07/20 بود در فیلد سوم یا در یک تکس باکس date3:4 روز را به ما بدهد
    با تشکر از همه عزیزان
    داود

  5. #5
    کاربر دائمی
    تاریخ عضویت
    تیر 1382
    محل زندگی
    ایران-سیرجان
    پست
    273
    سلام
    تابعی که برای شما نوشتم این کاررو می‌کنه. کافیه شما مقادیر y1,m1,d1,y2,m2,d2 را از داخل فیلدهای date1 و date2 استخراج کنید و به تابع بدهید و نتیجه تابع رو در فیلد date3 بنویسید.

  6. #6
    نقل قول نوشته شده توسط davoodmz
    من برای ورود تاریخ شمسی و ... مشکلی ندارم
    داود
    درسته دوست عزیز ولی فرض کنید که یک تاریخ 83/12/28 و تاریخ دوم 84/1/1 حالا فاصله سه روزه یا دو روز ؟
    به خاطر اینکه سال 83 کبیسه هست پس جواب باید 3 باشد اما در مورد سالهای دیگه جواب 2 می باشد .
    برای بدست آوردن سال کبیسه هم سال رو تقسیم بر چهار کن اگه باقیمانده 3 شد یعنی اون سال کبیسه است .

  7. #7
    نقل قول نوشته شده توسط saeed_d
    سلام
    تابعی که برای شما نوشتم این کاررو می‌کنه. کافیه شما مقادیر y1,m1,d1,y2,m2,d2 را از داخل فیلدهای date1 و date2 استخراج کنید و به تابع بدهید و نتیجه تابع رو در فیلد date3 بنویسید.
    دوست عزیز اما الگوریتم شما هم سال کبیسه رو پوشش نمی ده .

  8. #8
    کاربر دائمی
    تاریخ عضویت
    تیر 1382
    محل زندگی
    ایران-سیرجان
    پست
    273
    نقل قول نوشته شده توسط Saeid59_m
    دوست عزیز اما الگوریتم شما هم سال کبیسه رو پوشش نمی ده .
    سلام
    این قسمت از کد رو نگاه کنید:
     
    if y1 mod 4=3 then
    begin
    if (m1<7) and (m2<7) then
    day:=31-d1+(6-m1)*31+180+(m2-1)*31+d2;
    if (m1<7) and (m2>6) then
    day:=31-d1+(6-m1)*31+180+186+(m2-7)*30+d2;
    if (m1>6) and (m2<7) then
    day:=30-d1+(12-m1)*30+(m2-1)*31+d2;
    if (m1>6) and (m2>6) then
    day:=30-d1+(12-m1)*30+186+(m2-7)*30+d2;
    end
    else
    begin
    if (m1<7) and (m2<7) then
    day:=31-d1+(6-m1)*31+179+(m2-1)*31+d2;
    if (m1<7) and (m2>6) then
    day:=31-d1+(6-m1)*31+179+186+(m2-7)*30+d2;
    if (m1>6) and (m2<7) then
    day:=30-d1+(12-m1)*30-1+(m2-1)*31+d2;
    if (m1>6) and (m2>6) then
    day:=30-d1+(12-m1)*30-1+186+(m2-7)*30+d2;
    end


  9. #9
    درسته من دقت نکردم عذر می خوام .

  10. #10
    ما می تونیم یه تابع بنویسیم که خودش تاریخ را محاسبه کنه فقط کافیه که مقدار دقیق هر سال را به دست بیاریم تا سالهای کبیسه را شناسایی کنیم.
    مقدار هر سال 365 روز 6 ساعت ؟؟ دقیقه و ؟؟ ثانیه

    موفق باشید.

  11. #11
    باسلام
    دوستان عزیز
    به جواب رسیدم با تشکر از همه
    داود

  12. #12
    کاربر دائمی آواتار فرزاد دلفی باز
    تاریخ عضویت
    تیر 1383
    محل زندگی
    ایـــران ....
    پست
    464

    Function P_Date_Date(_FirstDate,_EndDate:String):String;
    Var
    i:Byte;
    Str1,Str2,Str3,Str4,Str5,Str6,Final:ShortString;
    _CheckLengh:Boolean;
    Begin
    If (Length(_FirstDate)=8) AND (Length(_EndDate)=8) Then
    Begin
    For i:=7 To 8 Do Str1:=Str1+_FirstDate[i];
    For i:=7 To 8 Do Str2:=Str2+_EndDate[i];
    For i:=4 To 5 Do Str3:=Str3+_FirstDate[i];
    For i:=4 To 5 Do Str4:=Str4+_EndDate[i];
    For i:=1 To 2 Do Str5:=Str5+_FirstDate[i];
    For i:=1 To 2 Do Str6:=Str6+_EndDate[i];
    _CheckLengh:=True;
    End
    Else
    If (Length(_FirstDate)=10) AND (Length(_EndDate)=10) Then
    Begin
    For i:=9 To 10 Do Str1:=Str1+_FirstDate[i];
    For i:=9 To 10 Do Str2:=Str2+_EndDate[i];
    For i:=6 To 7 Do Str3:=Str3+_FirstDate[i];
    For i:=6 To 7 Do Str4:=Str4+_EndDate[i];
    For i:=1 To 4 Do Str5:=Str5+_FirstDate[i];
    For i:=1 To 4 Do Str6:=Str6+_EndDate[i];
    _CheckLengh:=True;
    End
    Else
    _CheckLengh:=False;
    If _CheckLengh Then
    Begin
    Str5:=IntToStr(StrToInt(Str5)*365);
    Str6:=IntToStr(StrToInt(Str6)*365);
    If Str3<='6' Then Str5:=IntToStr((StrToInt(Str5)+StrToInt(Str3)*31)) ;
    If Str4<='6' Then Str6:=IntToStr((StrToInt(Str6)+StrToInt(Str4)*31)) ;
    If (Str3>'6') and (Str3<='12') Then
    Begin
    Str3:=IntToStr(StrToInt(Str3)-6);
    Str5:=IntToStr((StrToInt(Str5)+(StrToInt(Str3)*30) +186));
    End;
    If (Str4>'6') and (Str4<='12') Then
    Begin
    Str4:=IntToStr(StrToInt(Str4)-6);
    Str6:=IntToStr((StrToInt(Str6)+(StrToInt(Str4)*30) +186));
    End;
    Str5:=intToStr(StrToInt(Str5)+(StrToInt(Str1)));
    Str6:=intToStr(StrToInt(Str6)+(StrToInt(Str2)));
    Final:=intToStr(StrToInt(Str6)-(StrToInt(Str5)));
    Result:=Final;
    End;
    End;


  13. #13
    جناب آقای فرزاد متاسفانه تابع شما اصلا درست کار نمی کنه

  14. #14
    کاربر دائمی آواتار Touska
    تاریخ عضویت
    مرداد 1383
    محل زندگی
    ایران زمین
    سن
    39
    پست
    1,988

    Talking

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

    Persian.dll

    Function XAddToDate(XDate : ShortString; XAdd : Integer) : ShortString

    این تابع یک تاریخ شمسی را گرفته و به آن XAdd روز اضافه می کند و شمسی بر می گرداند.

    Function XSubDate(XDate : ShortString; XSub : Integer) : ShortString

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


    موفق باشید

  15. #15
    کاربر دائمی
    تاریخ عضویت
    فروردین 1385
    محل زندگی
    آنجا سرای ابدی است
    پست
    2,011

    showmessage(datetostr(date-12));

    یا
    DaysBetween function
    Returns the number of whole days between two specified TDateTime values.

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

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