ورود

View Full Version : کم کردن دو تاریخ و نتیجه به روز



davoodmz
شنبه 15 مهر 1385, 10:35 صبح
با سلام و قبولی طاعات و عبادات همه دوستان و عزیزان

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

saeed_d
شنبه 15 مهر 1385, 11:07 صبح
سلام
این تابع رو خودم نوشتم. ببین بدرد می‌خوره؟


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;

Saeid59_m
شنبه 15 مهر 1385, 11:22 صبح
منم این تابع رو نوشتم که تاریخ رو به عدد تبدیل می کنه .
البته نامردی اگه این نکته رو نگم که آخر سال دو سه روزی کم و زیاد می شه


{-------------------------------------------------------------------}
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;
{-------------------------------------------------------------------}

davoodmz
یک شنبه 16 مهر 1385, 14:11 عصر
با سلام بر دوستان
ضمن عرض تشکر از شما من فقط می خواهم دو فیلد تاریخ را از هم کم کنم و در فید سوم بنویسم
ساختار فیلدها نیز text می باشد با 10 کاراکتر
من برای ورود تاریخ شمسی و ... مشکلی ندارم

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

saeed_d
یک شنبه 16 مهر 1385, 15:57 عصر
سلام
تابعی که برای شما نوشتم این کاررو می‌کنه. کافیه شما مقادیر y1,m1,d1,y2,m2,d2 را از داخل فیلدهای date1 و date2 استخراج کنید و به تابع بدهید و نتیجه تابع رو در فیلد date3 بنویسید.

Saeid59_m
دوشنبه 17 مهر 1385, 09:06 صبح
من برای ورود تاریخ شمسی و ... مشکلی ندارم
داود

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

Saeid59_m
دوشنبه 17 مهر 1385, 09:12 صبح
سلام
تابعی که برای شما نوشتم این کاررو می‌کنه. کافیه شما مقادیر y1,m1,d1,y2,m2,d2 را از داخل فیلدهای date1 و date2 استخراج کنید و به تابع بدهید و نتیجه تابع رو در فیلد date3 بنویسید.

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

saeed_d
دوشنبه 17 مهر 1385, 10:38 صبح
دوست عزیز اما الگوریتم شما هم سال کبیسه رو پوشش نمی ده .
سلام
این قسمت از کد رو نگاه کنید::چشمک:


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

Saeid59_m
دوشنبه 17 مهر 1385, 11:16 صبح
درسته من دقت نکردم عذر می خوام .

mehdi_mohamadi
دوشنبه 17 مهر 1385, 11:39 صبح
ما می تونیم یه تابع بنویسیم که خودش تاریخ را محاسبه کنه فقط کافیه که مقدار دقیق هر سال را به دست بیاریم تا سالهای کبیسه را شناسایی کنیم.
مقدار هر سال 365 روز 6 ساعت ؟؟ دقیقه و ؟؟ ثانیه

موفق باشید.

davoodmz
دوشنبه 17 مهر 1385, 13:30 عصر
باسلام
دوستان عزیز
به جواب رسیدم با تشکر از همه
داود

فرزاد دلفی باز
پنج شنبه 20 مهر 1385, 11:39 صبح
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;

mehdi_mohamadi
جمعه 11 اسفند 1385, 07:29 صبح
جناب آقای فرزاد متاسفانه تابع شما اصلا درست کار نمی کنه :متفکر:

Touska
جمعه 11 اسفند 1385, 15:31 عصر
می توتید از Persian.Dll استفاده کنید که همه این توابع را بدون مشکل در اختیار شما می گذارد.

Persian.dll (http://www.barnamenevis.org/forum/showthread.php?t=45349#post269056)

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

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

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

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


موفق باشید :قلب:

dkhatibi
جمعه 11 اسفند 1385, 17:44 عصر
showmessage(datetostr(date-12));

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