PDA

View Full Version : سوال: الگوریتم پیدا کردن فاصله بین دو زمان



f.shahabadi
شنبه 01 خرداد 1389, 09:49 صبح
با سلام من یک برنامه پارکینگ دارم مینویسم می خوام از ساعت ورود ماشین تا ساعت خروج ماشین به ازای هر نیم ساعت یک مقدار ثابت اضافه کنه ساعت ورود وخروج به فرمتH:MM است میشه لطفا الگوریتمشو اگه دارین برام بذارین یا راهنماییم کنید منتظر هرنوع کمکی هستم

nima898
شنبه 01 خرداد 1389, 11:28 صبح
با عرض سلام برای زمانهای کمتر از 24 ساعت:
ساعت و دقیقه رو جدا تفریق کنید و اگه حاصل دقیقه منفی شد با عدد 60 جمع کنید و از حاصل ساعت عدد یک رو کم کنید و در نهایت اگه حاصل ساعت منفی شد (یعنی از ساعت 24 گذشته) حاصل ساعت رو با عدد 24 جمع کنید

f.shahabadi
شنبه 01 خرداد 1389, 12:25 عصر
با تشکر برای بیشتر از 24 ساعت چگار کنم تو رو خدا کمک کنین :گریه:

Shahram_Shobeiri
شنبه 01 خرداد 1389, 14:04 عصر
http://barnamenevis.org/forum/showthread.php?t=213339

nima898
یک شنبه 02 خرداد 1389, 08:58 صبح
برای بیشتر از 24 ساعت باید از تاریخ اسنفاده بشه فکر نکنم راه دیگه ای داشته باشه

Hossein Bazyan
یک شنبه 02 خرداد 1389, 12:00 عصر
سلام
من تابع زیر رو خودم برای خودم نوشتم و دارم ازش استفاده میکنم


Public Function TimeSubtraction(ByVal Time1 As String, ByVal Time2 As String) As String
Dim t1() As String = Nothing
Dim t2() As String = Nothing
Dim _Ret As String = Nothing
Dim outT1 As Decimal = 0
Dim outT2 As Decimal = 0
Dim out As Decimal = 0
Dim Hou As Decimal = 0
Dim Min As Decimal = 0
Try
t1 = Split(Time1, ":")
t2 = Split(Time2, ":")
outT1 = (Convert.ToInt16(t1(0)) * 60) + Convert.ToInt16(t1(1))
outT2 = (Convert.ToInt16(t2(0)) * 60) + Convert.ToInt16(t2(1))
out = outT2 - outT1
Hou = Int(out / 60)
Min = Int(out Mod 60)
_Ret = SetNumber(Hou) & ":" & SetNumber(Min)
Catch ex As Exception
End Try
Return _Ret
End Function


زمانها رو به شکل رشته و با فرمت HH:MM به تابع وارد میکنم و سپس آنها را تبدیل به دقیقه مینکم و زمان دوم را از اول کم کرده و به فرمت HH:MM برمیگردانم و به فرمت رشته هم نتیجه رو برمیگردونم
در ضمن برای اینکه ساعت و دقیقه همیشه دو رقمی باشند تابعی هم بنام SetNumber نوشته ام که به شکل زیر میباشد


Public Function SetNumber(ByVal ii As String) As String
Dim _r As String = Nothing
Select Case ii.Trim.Length
Case 1
_r = "0" & ii
Case 2
_r = ii
End Select
Return _r
End Function

f.shahabadi
دوشنبه 03 خرداد 1389, 09:46 صبح
با تشکر از همه دوستان
ببینید مشکل گم گردن دو زمان درست شد ولی فقط برای زمانیکه ورود و خروج در یک روز باشد حالا مشکل اینجاست که اگه در دو تاریخ متفاوت باشه باید چکار گرد مثلا 23:15 در تاریخ 11/11/1388بیاد و 4:05 بامداددر تاریخ 12/11/1388 بره؟:عصبانی++:

Hossein Bazyan
دوشنبه 03 خرداد 1389, 11:11 صبح
با تشکر از همه دوستان
ببینید مشکل گم گردن دو زمان درست شد ولی فقط برای زمانیکه ورود و خروج در یک روز باشد حالا مشکل اینجاست که اگه در دو تاریخ متفاوت باشه باید چکار گرد مثلا 23:15 در تاریخ 11/11/1388بیاد و 4:05 بامداددر تاریخ 12/11/1388 بره؟:عصبانی++:

سلام
باز هم فرقی نداره در اینحالت شما کنترل کن که تاریخ همانروزه یا نه اگر بود که تابع بالا اگر نبود تعداد روزهای اختلاف رو بدست بیار و به ازای هر روز ، آنرا در 24 در 3600 صرب کن و به زمان دوم اضافه کن تا اختلاف به دست بیاد.

f.shahabadi
دوشنبه 03 خرداد 1389, 12:39 عصر
سلام
باز هم فرقی نداره در اینحالت شما کنترل کن که تاریخ همانروزه یا نه اگر بود که تابع بالا اگر نبود تعداد روزهای اختلاف رو بدست بیار و به ازای هر روز ، آنرا در 24 در 3600 صرب کن و به زمان دوم اضافه کن تا اختلاف به دست بیاد.

خوب تعداد روزهای اختلاف رو چه جوری بدست بیارم الگوریتمی که این کارو بکنه ندارین ؟مثلا اگه روز29/12/1388 اومد و 01/01/1389 رفت چی گار گنم؟با تشکر

nima898
چهارشنبه 05 خرداد 1389, 09:53 صبح
با تشکر از همه دوستان
ببینید مشکل گم گردن دو زمان درست شد ولی فقط برای زمانیکه ورود و خروج در یک روز باشد حالا مشکل اینجاست که اگه در دو تاریخ متفاوت باشه باید چکار گرد مثلا 23:15 در تاریخ 11/11/1388بیاد و 4:05 بامداددر تاریخ 12/11/1388 بره؟:عصبانی++:


این که میشه کمتر از 24 ساعت تو پست شماره 2 توضیحشو دادم

mortezaadi
چهارشنبه 05 خرداد 1389, 10:43 صبح
منم برنامه پارکینگ نوشتم :چشمک:
با این تابع تاریخ شمسی خودتو به میلادی تبدیل کن

Public Shared Function ShamsiToMiladi(ByVal persianshortdate As String, Optional ByVal Dhour As Integer = 12, _
Optional ByVal Dminute As Integer = 0, _
Optional ByVal Dsecond As Integer = 0, _
Optional ByVal Dmilisecond As Integer = 0) As Date

persianshortdate = ToMilitary(persianshortdate)
Dim year As Integer = CInt(persianshortdate.Remove(4, persianshortdate.Length - 4))
Dim str2 As String
str2 = persianshortdate.Remove(0, 5)
If Left(str2, 2).EndsWith("/") Then
str2 = Left(str2, 1)
Else
str2 = Left(str2, 2)
End If
Dim str3 As String
Dim month As Integer = CInt(str2)
If Right(persianshortdate, 2).StartsWith("/") Then
str3 = Right(persianshortdate, 1)
Else
str3 = Right(persianshortdate, 2)
End If
Dim day As Integer = CInt(str3)
Dim cal As New PersianCalendar
Return CDate(cal.ToDateTime(year, month, day, Dhour, Dminute, Dsecond, Dmilisecond, PersianCalendar.PersianEra))
End Functionبعد با این تابع میتونی فاصله دو تاریخ رو بدست بیاری ( بر حسب روز و ساعت و دقیقه و ثانیه و تیک و............


Public Shared Function ShamsiDiff(ByVal date1 As String, ByVal date2 As String, ByVal Interval As DateInterval) As Long
Dim _date1 As Date = ShamsiToMiladi(date1)
Dim _date2 As Date = ShamsiToMiladi(date2)
ShamsiDiff = DateDiff(Interval, _date1, _date2)
End Function

این تابع هم بررسی میکنه که تاریخ به صورت YYYY/MM/DD وارد شده باشه

Public Shared Function ToMilitary(ByVal DateStr As String) As String
DateStr = Replace(DateStr, "\", "/")
Dim Str1 As String = DateStr
If Mid(DateStr, 7, 1) = "/" Then
Str1 = Left(DateStr, 5) & 0 & Mid(DateStr, 6, Len(DateStr) - 5)
End If
If Len(Str1) = 9 Then
Str1 = Left(Str1, 8) & 0 & Right(Str1, 1)
End If
Return Str1
End Function

من عین کد برنامه خودمو اینجا paste کردم وقت نکردم مرتبش کنم اگه جایی تو کد یه تابع دیگرو فراخوانی کرد پاکش کن ( روی vs 2005,2008,2010 جواب میده)

Hossein Bazyan
چهارشنبه 05 خرداد 1389, 11:11 صبح
خوب تعداد روزهای اختلاف رو چه جوری بدست بیارم الگوریتمی که این کارو بکنه ندارین ؟مثلا اگه روز29/12/1388 اومد و 01/01/1389 رفت چی گار گنم؟با تشکر

سلام
این هم تابعی برای بدست آوردن فاصله دو تاریخ. خروجی تابع تعداد روزهای بین دو تاریخ است .




Public Function Between2Date(ByVal TimeIN As DateTime, ByVal TimeOut As DateTime) As Double ' String
Dim ts As TimeSpan = TimeOut.Subtract(TimeIN)
Dim _M_ As Double
_M_ = (ts.Hours * 3600) + (ts.Minutes * 60) + ts.Seconds
Return (_M_)
End Function

nima898
چهارشنبه 05 خرداد 1389, 12:26 عصر
خوب تعداد روزهای اختلاف رو چه جوری بدست بیارم الگوریتمی که این کارو بکنه ندارین ؟مثلا اگه روز29/12/1388 اومد و 01/01/1389 رفت چی گار گنم؟با تشکر
این مورد هم میشه کمتر از 24 ساعت تو پست شماره 2 توضیحشو دادم