2012-01-19 28 views
1

我遇到下面的代碼有問題。它將毫秒轉換爲幾個月,幾天,幾小時和幾分鐘。爲什麼這個時間單位換算歸零?

long diffms = date2l - date1l; //The result here is in milliseconds; The value of date2l - date1l are different 
long diff_minute = diffms/60000; 

long diff_hour = diff_minute/60; float diff_minute_now = (diff_minute % 1) * 60; int dmn = (int) diff_minute_now; 
long diff_day = diff_hour/24; float diff_hour_now = (diff_hour % 1) * 24; int dhn = (int) diff_hour_now; 
long diff_month = diff_day/30; float diff_day_now = (diff_day % 1) * 30; int ddn = (int) diff_day_now; 

diffe = new LabelField 
("Remaining Time : " + Long.toString(diff_month) + " month(s) " 
        + Integer.toString(ddn) + " day(s) " 
        + Integer.toString(dhn) + " hour(s) " 
        + Integer.toString(dmn) + " minute(s)"); 
add(diffe); 

爲什麼結果值全爲零?

編輯: @BicycleDude我修改代碼爲:

long diffms = date2l - date1l; 
long ts = diffms/1000; 

long mo = ts/60/60/24/30; 
long d = (ts - mo * 30 * 24 * 60 * 60)/(60 * 60 * 24); 
long h = (ts - d * 24 * 60 * 60)/(60 * 60); 
long m = (ts - h * 60 * 60)/60; 

但時間不工作

+0

你在使用值'date2l'和'date1l'?如果'date2l == date1l',你會期望所有的值爲0. – Jeffrey

+0

它是以毫秒爲單位的日曆格式的時間。他們是不同的。 –

回答

1

我要立足於代碼編輯的部分我的答案,因爲BicycleDude早已指出模操作有什麼問題。

long diffms = date2l - date1l; //difference in ms 
long ts = diffms/1000; //total difference in seconds 

long mo = ts/60/60/24/30; //(1) 
long d = (ts - mo * 30 * 24 * 60 * 60)/(60 * 60 * 24); //follows on because of (1) 
long h = (ts - d * 24 * 60 * 60)/(60 * 60); //follows on because of (1) 
long m = (ts - h * 60 * 60)/60; //follows on because of (1) 

好吧,我以爲會有多種問題,但我認爲(認爲,我可能失去了一些東西......),主要錯誤是從月計算,這點我表示未來在代碼中的評論(1)。你不能像這樣計算月份的差異。

爲什麼?如果差異超過一個月,怎麼樣?你不需要除以31,而是?或者如果這是一個閏年?如果是2月份,你需要除以29。由於整數除法不包括小數或小數,所以您可能會在月差計算中得到不準確的結果。如果你用幾小時的差異來計算天數的差異,那麼最好的辦法是用幾個月的時間來計算差異。 (編輯:我想你也就需要考慮到天差計算的區別時幾個月,通過檢查你的「原點」和我上面提到的因素,「目標」日期,但我不會我不太確定自己寫在這個階段......)

由於您在計算月份差異的方式上存在問題,並且您使用錯誤的值來計算天數差異,所以我認爲這會導致錯誤傳播到您的其他一些值(例如小時差)。

編輯

好了,我的代碼更有點打亂左右。正如我前面指出的那樣,您的月計算是危險的,會影響您的日計算,這可能會在以後引入錯誤。

通過您在評論中提供的示例,您的代碼在天數中有3天的差異。 (該例子是2012年1月19日至2012年5月3日)。我對BicycleDude的代碼運行了這個,並沒有問題。

我將重新發布代碼,並根據已經過了多少小時,我添加了一行來查找天數。

long h = ts/60/60; // hour part 
long m = (ts - h * 60 * 60)/60; // minute part 
long s = (ts - h * 60 * 60 - m * 60); // second part 
long d = h/24; 

如果你喜歡做,這樣你可以閱讀,「有w天,x小時,y分鐘和date2l和date1l之間z秒」,你可以做這樣的事情:

long date2l = Timestamp.valueOf("2012-05-03 05:30:10").getTime(); 
long date1l = Timestamp.valueOf("2012-01-19 00:00:00").getTime(); 
long diffms = date2l - date1l; //difference in ms 
long diff_seconds = diffms/1000; //total difference in seconds 
long diff_mins = diff_seconds/60; //total difference in minutes 
long diff_hours = diff_mins/60; //total difference in hours 
long diff_days = diff_hours/24; //total difference in days 

long x = (diff_seconds - diff_days * 60 * 60 * 24)/(60 * 60); 
long y = ((diff_seconds - (diff_hours * 60 * 60)))/60; 
long z = ((diff_seconds - (diff_mins * 60))); 
long w = diff_days; 

System.out.println(w + " " + x + " " + y + " " + z); 

它似乎工作。

我還沒有想出幾個月的部分,因爲這是很多不平凡的,但是。這種有用嗎?

+0

這是一樣的。我得到了13天0小時18720分鐘的結果。不能說ts的價值,因爲我自己並不知道。 date1l和date2l取自日曆功能。但我今天(2012年1月19日)至2012年2月1日計數 –

+0

@blahman謝謝你的工作。 –

+0

啊,好的。讓我重新檢查一下代碼,然後......我很確定我之前注意到的是什麼,但它可能不是很明顯,因爲在你檢查的日期內差距不到一個月。 – blahman

5

「任何%1」將返回0。這可能不是你的原意。

  1. 您最初劃分變量的類型長。所以他們的結果也會很長。 (例如12345/100 = 123而不是123.45)。
  2. 模運算符適用於在整數的除法的餘數。 (例如12345%100 = 45)。
  3. 您提供的不提取日,月,小時,分鐘,該算法第二的方式,你的預期。在它正確之前它需要返工。

我已經修改了公式的假設有31天一個月:

long diffms = date2l - date1l; 
long mo = (diffms/1000/60/60/24/31); 
long d = (diffms/1000/60/60/24) % 31; 
long h = (diffms/1000/60/60) % 24; 
long m = (diffms/1000/60) % 60; 
long s = (diffms/1000) % 60; 
+1

+1剛剛打敗了我:) –

+0

好吧,讓我們說diff_minute的值是100,000。爲了達到數小時,我必須除以60,結果將是1667.67。 0.67的值應該乘以60得到分鐘的最後一個值嗎?那麼這樣做的方式不是diff_minute%1? –

+0

編號x%y將x除以y,然後返回該操作的整數餘數。 7%2是1,8%2是0.如果你想得到60的0.67倍,那就是0.67 * 60. – arcy

1

TimeUnit類提供工廠方法,簡化了大部分工作:

import static java.util.concurrent.TimeUnit.*; 


// First, calculate the total difference in each unit 
long diffDays = MILLISECONDS.toDays(diffMs); 
long diffHours = MILLISECONDS.toHours(diffMs); 
long diffMinutes = MILLISECONDS.toMinutes(diffMs); 
long diffSeconds = MILLISECONDS.toSeconds(diffMs); 

// Next, calculate the differences 
long months = diffDays/30; 
long days = diffDays - 30 * months; 
long hours = diffHours - DAYS.toHours(diffDays); 
long minutes = diffMinutes - HOURS.toMinutes(diffHours); 
long seconds = diffSeconds - MINUTES.toSeconds(diffMinutes);