2014-02-06 57 views
1

我目前正在試驗,以達到以下目的:Java中的日期總是1小時?

  • 我創建一個Android應用程序,以幫助我在工作中管理ROTAS。更多的空閒時間項目,真正幫助。
  • 對於每位員工,我可以將開始時間和結束時間設置爲以下格式的字符串:「HH:mm」。
  • 我需要計算總小時數,然後計算總小時數,包括休息時間。
  • 下面,如果有人工作超過3小時45分鐘但少於6小時,我希望他們有15分鐘的休息時間。
  • 例如,如果某人工作4小時(總時間爲04:00),他們將得到15分鐘的休息時間(包括休息時間的小時03:45)。

問題:目前,如果我設置時間06:00結束,開始在10:00我希望它給我總學時爲4小時,包括休息爲3小時45分鐘。實際上,它給我的總小時數爲5,小時數包括休息時間爲5小時45分鐘。

private String calcDiffInHoursAsString(Date start, Date finish){ 
    try{ 
     DateFormat formatter = new SimpleDateFormat("HH:mm"); 

     long diffInMillis = finish.getTime() - start.getTime(); 
     Date diffAsDate = new Date(diffInMillis); 
     String diffAsHours = formatter.format(diffAsDate); 

     return diffAsHours; 
    }catch(Exception ex){ 
     return ""; 
    } 
} 

private Date calcDiffInHoursAsDate(Date start, Date finish){ 
    try{ 
     DateFormat formatter = new SimpleDateFormat("HH:mm"); 

     long diffInMillis = finish.getTime() - start.getTime(); 
     Date diffAsDate = new Date(diffInMillis); 

     return diffAsDate; 
    }catch(Exception ex){ 
     return new Date(); 
    } 
} 

private String calcHoursToString(String start, String finish){ 
    if (!(start == "00:00" && finish == "00:00")){ 

     try{ 
      DateFormat formatter = new SimpleDateFormat("HH:mm"); 
      Date startTime = formatter.parse(start); 
      Date finishTime = formatter.parse(finish); 

      Date HoursExcBreaks = calcDiffInHoursAsDate(startTime, finishTime); 
      String HoursExcBreaksAsString = calcDiffInHoursAsString(startTime, finishTime); 
      Log.d("Difference exc. Breaks", HoursExcBreaksAsString); 

      // Breaks: 
      // < 4 hours - No Break 
      // 4 - 6 hours - 15 Minutes 
      // 6 - 8 hours - 30 Minutes 
      // 8 - 9 hours - 45 Minutes 

      // Work out actual hours after breaks 

      // If HoursExcBreaks > 03:45 and HoursExcBreaks < 06:00 then take 00:15 break... 
      if (HoursExcBreaks.before(formatter.parse("06:00")) && HoursExcBreaks.after(formatter.parse("03:45"))){ 
       long millisecondsIncBreak = HoursExcBreaks.getTime() - formatter.parse("00:15").getTime(); 
       Date dateIncBreak = new Date(millisecondsIncBreak); 
       String hoursIncBreak = formatter.format(dateIncBreak); 

       Log.d("Shift Inc Breaks", hoursIncBreak); 
      } 


     }catch(Exception ex){ 
      Context context = getActivity(); 
      CharSequence text = ex.getMessage(); 
      int duration = Toast.LENGTH_SHORT; 

      Toast toast = Toast.makeText(context, text, duration); 
      toast.show(); 
     } 

    } 

    return ""; 
} 

所以,當我打電話:

calcHoursToString("06:00", "10:00"); 

我得到包括假期,因爲在一個字符串03:45移位長度。

事實是,我甚至不確定這是解決問題的最好方法嗎?這可能不是! :)

+0

只是好奇,你在什麼時區? – 323go

+2

你不顯示你如何獲得投入和他們有什麼價值。我可以向你保證,基本的計算工作,所以它必須是你的輸入值和/或推理。最好的方法是使用調試器並檢查值。我想你會發現他們不是你所想的那樣。您也可以複製/粘貼到Excel(或類似)來驗證計算。 – Simon

+0

@Simon我也可以向你保證他們沒有。我試着把輸入完全取出來,並將值放入java中,但它的結果相同。我檢查的第一件事是它從輸入中獲得正確的數據。正如你在上面看到的,我現在已經完全忽略了輸入,並把字符串放在自己的頭上。 –

回答

2

你的問題是在這裏:

long diffInMillis = finish.getTime() - start.getTime(); 
Date diffAsDate = new Date(diffInMillis); 

您使用java.util.Date表示的持續時間,而不是絕對時間點,這將導致各種問題。具體來說,在這種情況下,當您執行新日期(diffInMillies)時,diffInMillis將在UTC的上下文中解釋,這可能不是您所在的時區...

請勿使用Date來表示持續時間!只需將其保留爲像int或long這樣的基本類型即意味着毫秒數。

如果您想要很好地設置持續時間的格式,您必須手動執行此操作,或者如其他人指出的那樣,您可以使用框架(如JODA),該框架內置了持續時間類。

+0

你有沒有任何例子將兩個字符串像12:00和14:00一樣轉換爲使用Joda的區別?我可以找到很多方法與喬達比較兩個日期,但不能比較兩次? –

+0

您應該可以通過閱讀Javadoc來了解這一點。我實際上並沒有與Joda-Time親身經歷,但快速瀏覽似乎表明這樣的事情應該有效: 'LocalTime start = LocalTime.parse(「12:00」); LocalTime完成= LocalTime.parse(「14:00」); long difference = finish.getMillisOfDay() - start.getMillisOfDay();' 我會盡量保持這個值,特別是要做計算。要將其格式化爲字符串,請查看「持續時間」和「PeriodFormatter/PeriodFormatterBuilder」類。 –

+0

跟進的好回答。感謝您的幫助,我一直恨任何代碼與時間工作。 –

1

亞歷克斯,

一個用來日期之間的差異評估的最佳框架是JODA

例如,

Hours.between(startDate, endDate); 
0

你沒有考慮到時區......只要你開始的日期轉換(轉換時間長值到日期),你需要採取的時區考慮的工作。如果你在兩個日期之間做了一些區別,而這兩個日期不是在同一個TimeZone上設置的,這確實會發生什麼。

相關問題