我有一個小時選擇下拉0-23
和分鐘選擇下拉0-59
分別爲Start time
和End time
(所以四個控件)。算法需要兩次計算差異
我正在尋找一種算法來計算使用這四個值的時間差。
由於它們沒有存儲在精美的日期/時間選擇控件中,我不認爲我可以使用任何標準的日期/時間操作函數。
如何計算兩次之間的差異?
我有一個小時選擇下拉0-23
和分鐘選擇下拉0-59
分別爲Start time
和End time
(所以四個控件)。算法需要兩次計算差異
我正在尋找一種算法來計算使用這四個值的時間差。
由於它們沒有存儲在精美的日期/時間選擇控件中,我不認爲我可以使用任何標準的日期/時間操作函數。
如何計算兩次之間的差異?
這個僞代碼爲您提供算法來計算出分鐘的差異。
它假定如果開始時間在結束時間之後,則開始時間實際上是前一天。
startx = starthour * 60 + startminute
endx = endhour * 60 + endminute
duration = endx - startx
if duration < 0:
duration = duration + 1440
startx
的和endx
值是自午夜的分鐘數。
這基本上是這樣做的:
不要那麼肯定,雖然你不能使用日期/時間操作功能。您可能會發現,你可以很容易地構造一個日期/時間,並計算不同的東西,如:
DateTime startx = new DateTime (1,1,2010,starthour,startminute,0);
DateTime endx = new DateTime (1,1,2010,endhour ,endminute ,0);
Integer duration = DateTime.DiffSecs (endx,startx)/60;
if (duration < 0)
duration = duration + 1440;
雖然它可能不是需要爲您的簡單場景。除非你發現自己在做一些更復雜的日期/時間操作,否則我會堅持使用上面給出的僞代碼。
然後,如果您想打開的持續時間(以分鐘爲單位)到小時和分鐘:
durHours = int(duration/60)
durMinutes = duration % 60 // could also use duration - (durHours * 60)
感謝帕克斯 T1 = 5:50 T2 = 8:30 startx的= 5 * 60 + 50 = 350 endx = 8 * 60 + 30 = 510 持續時間= 510-350 = 160 = 2小時40分鐘正確應該是2小時50分鐘 我錯過了什麼嗎? – Rishi 2010-08-19 06:05:06
是的,在一個數學系統中有一些數學能力:-)在兩個小時內從5:50到8:30以及_forty_分鐘。兩個小時從5點50分到7點50分,10分鐘到8點,30分鐘到8點半。十和三十分鐘,而不是五十分鐘。我不確定這個堅持是從哪裏來的,是2:50的持續時間。有什麼我們失蹤了嗎? – paxdiablo 2010-08-19 06:13:49
paxdiablo, 不,你不會錯過任何東西。不過我在想我爲什麼把50 ..出事了我的數學智力.. – Rishi 2010-08-19 06:32:10
首先,你需要檢查是否結束時間大於或等於開始時間來防止任何問題。爲此,您首先檢查End_Time_Hour是否大於Start_Time_Hour。如果它們相等,則會檢查End_Time_Min是否大於或等於Start_Time_Min。 接下來,您將從End_Time_Hour中減去Start_Time_Hour。然後你會從End_Time_Min中減去Start_Time_Min。如果分鐘的差值小於0,則將小時差值減1,並將分鐘差值加到60(或59,測試)。將這兩者合在一起,你應該全部設置好。
感謝阿倫。可你確認我在演示正確, T1 = 5:50 T2 = 8:30 H = 8 - 5 = 3 M = 30-50 = -20 由於m是小於0,因此, H = 3-1 = 2 現在加上微小差異爲60, 米= 60 + 20 = 80 結果,2:80? – Rishi 2010-08-19 05:51:43
我的意思是增加分鐘的差異,但留下負號。所以30-50 = -20 ... m = 60 + -20 = 40。或者你可以減去絕對值:D – 2010-08-19 05:54:20
亞倫,謝謝..但它仍然會到2:40,但正確的應該是2 :50:P – Rishi 2010-08-19 06:00:37
$start_time_hr = 5;
$start_time_mi = 50;
$end_time_hr = 8;
$end_time_mi = 30;
$diff = (($end_time_hr*60)+$end_time_mi) - (($start_time_hr*60)+$start_time_mi);
$diff_hr = (int)($diff/60);
$diff_mi = (int)($diff) - ($diff_hr*60);
echo $diff_hr . ':' . $diff_mi;
這將計算在幾分鐘時間,包括一年因素
//* Assumptions:
Date is in Julian Format
startx = starthour * 60 + startminute
endx = endhour * 60 + endminute
duration = endx - startx
if duration <= 0:
duration = duration + 1440
end-if
if currday > prevday
duration = duration + ((currday-preday) - 1 * 1440)
end-if
簡單的公式應該有所幫助:
mindiff = 60 + endtime.min - starttime.min
hrdiff = ((mindiff/60) - 1) + endtime.hr - starttime.hr
這給你以小時爲單位的持續時間和分鐘
h1 = "hora1"
m1 "min1"
h2 "hora2"
m2 = "min2"
if (m1 > m2)
{
h3 = (h2 - h1) - 1;
}
else
{
h3 = h2 - h1;
}
m1 = 60 - m1;
if (m1 + m2 >= 60)
{
m3 = 60 - (m1 + m2);
} else if (m3 < 0)
{
m3 = m3 * -1;
}
else
{
m3 = m1 + m2;
}
System.out.println("duration:" + h3 + "h" + m3 + "min");
如果你有一個func它返回自開始日期以來的天數(例如, dayssince1900),您可以將這兩個日期轉換爲自該開始日期以來的秒數,然後執行ABS(d1-d2),然後將秒數轉換回您想要的任何格式,例如HHHH:MM:SS
簡單的例如
SecondsSince1900(d)
{
return dayssince1900(d)*86400
+hours(d)*3600
+minutes(d)*60
+seconds(d);
}
diff = ABS(SecondsSince1900(d1)-SecondsSince1900(d2))
return format(diff DIV 3600)+':'+format((diff DIV 60) MOD 60)+':'+format(diff MOD 60);
哼道:沒那麼簡單,如果你要考慮到閏秒天文學家都熱衷於投入,不時。
「所以沒有語言或腳本可以使用」 - 什麼? – 2010-08-19 04:57:58
似乎它會回到筆和紙,然後... X-) – 2010-08-19 04:58:52
不,不好意思,不知道。 – griegs 2010-08-19 04:59:20