2010-08-19 185 views
0

我有一個小時選擇下拉0-23和分鐘選擇下拉0-59分別爲Start timeEnd time(所以四個控件)。算法需要兩次計算差異

我正在尋找一種算法來計算使用這四個值的時間差。

由於它們沒有存儲在精美的日期/時間選擇控件中,我不認爲我可以使用任何標準的日期/時間操作函數。

如何計算兩次之間的差異?

+7

「所以沒有語言或腳本可以使用」 - 什麼? – 2010-08-19 04:57:58

+2

似乎它會回到筆和紙,然後... X-) – 2010-08-19 04:58:52

+1

不,不好意思,不知道。 – griegs 2010-08-19 04:59:20

回答

10

這個僞代碼爲您提供算法來計算出分鐘的差異。

它假定如果開始時間在結束時間之後,則開始時間實際上是前一天。

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) 
+0

感謝帕克斯 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

+3

是的,在一個數學系統中有一些數學能力:-)在兩個小時內從5:50到8:30以及_forty_分鐘。兩個小時從5點50分到7點50分,10分鐘到8點,30分鐘到8點半。十和三十分鐘,而不是五十分鐘。我不確定這個堅持是從哪裏來的,是2:50的持續時間。有什麼我們失蹤了嗎? – paxdiablo 2010-08-19 06:13:49

+0

paxdiablo, 不,你不會錯過任何東西。不過我在想我爲什麼把50 ..出事了我的數學智力.. – Rishi 2010-08-19 06:32:10

0

首先,你需要檢查是否結束時間大於或等於開始時間來防止任何問題。爲此,您首先檢查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,測試)。將這兩者合在一起,你應該全部設置好。

+0

感謝阿倫。可你確認我在演示正確, 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

+0

我的意思是增加分鐘的差異,但留下負號。所以30-50 = -20 ... m = 60 + -20 = 40。或者你可以減去絕對值:D – 2010-08-19 05:54:20

+0

亞倫,謝謝..但它仍然會到2:40,但正確的應該是2 :50:P – Rishi 2010-08-19 06:00:37

0
$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; 
1

這將計算在幾分鐘時間,包括一年因素

//* 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 
1

簡單的公式應該有所幫助:

mindiff = 60 + endtime.min - starttime.min 
hrdiff = ((mindiff/60) - 1) + endtime.hr - starttime.hr 
0

這給你以小時爲單位的持續時間和分鐘

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"); 
0

如果你有一個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); 

哼道:沒那麼簡單,如果你要考慮到閏秒天文學家都熱衷於投入,不時。