PDA

View Full Version : جمع دو عدد بر حسب زمان



m_reza
چهارشنبه 02 مهر 1382, 17:37 عصر
با سلام

چگونه می توان دو مقدار 432:25 و 610:40 را با هم جمع کرد؟
برای این کار بصورت زیر عمل کردم :


var
t1,t2,t3:TDateTime;
begin
t1:=432:25;
t2:=610:35;
t3:=t1+t2;
ShowMessage(DateTimeToStr(t3));

اما نمی توان مقدار 432:25 دقیقه را به t1 نسبت داد؟
حال اگر فرض کنیم مقادیر t1 و t2 برابر با 432 و 610 باشند مقدار بازگشتی t3 برابر 1902/11/07 می باشد که به کمک چه تابعی می توان آن را به 1042:00 تبدیل کرد؟

shaniaki
چهارشنبه 02 مهر 1382, 18:04 عصر
با عرض ادب:
در مورد ساختار ذخیره سازی و کار با زمان قبلا توضیحاتی داده ام:
http://www.barnamenevis.org/forum/viewtopic.php?t=2643
امیدوارم مشکلتان را حل کند.

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

Hidarneh
چهارشنبه 02 مهر 1382, 19:05 عصر
و در مورد مقدار دهی :

t1:=strtotime('432:25');

m_reza
چهارشنبه 02 مهر 1382, 20:16 عصر
از کد شما استفاده کردم اما پیغام خطای زیر را می دهد


432:25 is not a valid time


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

Hidarneh
چهارشنبه 02 مهر 1382, 23:17 عصر
شرمنده :

shorttimeformat := 'hh:mm:ss';
t1:=strtotime('0:432:25');فکر کنم جواب بده ولی چون الان دلفی ندارم مطمئن نیستم .

amirrf
پنج شنبه 03 مهر 1382, 07:35 صبح
برای نگهداری مقدارهای تاریخ و زمان در دلفی از نوع TDateTime استفاده می شود. قسمت اعشاری آن نشانگر زمان گذشته از نیمه شب و قسمت صحیح آن تعداد روز گذشته از یک مبدا است. هنگامیکه از نوع TDateTime فقط برای زمان می خواهید استفاده کنید بخش صحیح آن برای شما معنی تعداد روز را پیدا می کند یعنی معادل 24 ساعت.
انجام عملیات ریاضی با TDateTime امکان پذیر و ساده است.
برای تبدیل مقداری از زمان در یک واحد خاص مثلا دقیقه آن را بر ثابت های زمان تقسیم کنید و برای تبدیل یک مقدار TDateTime به یک مقدار زمان با واحد موردنظر آن را در ثابت زمان مناسب ضرب کنید.

var T1, T2, T3: TDateTime;
begin
T1 := 432.25 / MinsPerDay; // or T1 := 432.25 * OneMinute
T2 := 610.35 / MinsPerDay; // or T1 := 610.35 * OneMinute
T3 := T1+T2;
ShowMessage(FloatToStr(T3*MinsPerDay));
end;
البته این در صورتی صحیح است که در 432.25 قسمت اعشاری بر حسب کسری از دقیقه باشد. در صورتی 25 مقدار ثانیه است باید آن را جداگانه درنظر بگیرید:

var T1, T2, T3: TDateTime;
begin
T1 := 432 / MinsPerDay + 25/SecsPerDay;
T1 := 610 / MinsPerDay + 35/SecsPerDay;
T3 := T1+T2;
ShowMessage(IntToStr(Trunc(T3*MinsPerDay)) + ':' + IntToStr(Trunc(T3*SecsPerDay)));
end;
یا بطور مشابه:

Mins := 432 + 25/SecsPerMin;
T1 := Mins / MinsPerDay;
...

تابع های تبدیل رشته به زمان و برعکس مثل StrToTime و TimeToStr در واقع زمان را به صورت ساعت در روز در نظر دارند و بنابراین مقدار دقیقه نمی تواند بیشتر از 59 باشد.

m_reza
پنج شنبه 03 مهر 1382, 10:51 صبح
var T1, T2, T3: TDateTime;
begin
T1 := 432 / MinsPerDay + 25/SecsPerDay;
T1 := 610 / MinsPerDay + 35/SecsPerDay;
T3 := T1+T2;
ShowMessage(IntToStr(Trunc(T3*MinsPerDay)) + ':' + IntToStr(Trunc(T3*SecsPerDay)));
end;


از کد مذکور استفاده کردم که خروجی آن 1042:62579=610:35+432:25 می باشد . حال به کمک چه تابع و یا فرمولی می توان آن را به 1043:00 تبدیل کرد ؟

با تشکر

amirrf
شنبه 05 مهر 1382, 08:45 صبح
ShowMessage(IntToStr(Round(T3*MinsPerDay)));
اگر می خواهید همیشه به سمت بالا گرد کند از تابع Ceil استفاده کنید.

m_reza
شنبه 05 مهر 1382, 10:56 صبح
از راهنمایی شما بسیار ممنون :lol:

bebakhshid
دوشنبه 21 مهر 1382, 14:27 عصر
می خوام زمان hh:mm:ssعملیات انجام بدم