2017-01-03 100 views
0

我的程序需要計算工作人員的工資計算用加班時間。爲此,我現在正在做的工作是讓工人的進入時間和時間,然後根據公司的時間表計算出每個工人加班多少小時。我需要將這些時間舍入到最接近的15分鐘,所以我需要一個班級在小時內通過並返回四捨五入的小時數。如何在java中將時間縮短到最接近的15分鐘

例如:

  • 如果加班時間是2.17小時,它必須被舍入到2.15。
  • 如果加班時間是2.24小時,它必須四捨五入到2.30。
  • 如果加班時間是2.40小時,它必須是2.45。
  • 如果加班時間是2.56小時,它必須是3小時。

    公共字符串RoundToNearest15Min(長時間){

    long milsec = Time; 
    System.out.println("milsecond :" + milsec); 
    long sec = Time/1000; 
    ValidateValues.roundupDouble(sec); 
    System.out.println("second :" + sec); 
    double min = sec/60; 
    ValidateValues.roundupDouble(min); 
    System.out.println("miniutes :" + min); 
    double hrs = min/60; 
    System.out.println("hours :" + hrs); 
    double roundeVal = ValidateValues.roundupDouble(hrs); 
    String hrsvalue = String.valueOf(roundeVal); 
    System.out.println(hrsvalue); 
    
    String splitVal[] = hrsvalue.split("\\."); 
    System.out.println(splitVal[0]); 
    System.out.println(splitVal[1]); 
    int splitedValue2 = Integer.parseInt(splitVal[1]); 
    int splitedValue1 = Integer.parseInt(splitVal[0]); 
    
    if (splitedValue2 <= 15) { 
        int rounded = splitedValue2 > 7 ? (15) : (0); 
        return splitedValue1 + "." + rounded; 
    } 
    if (splitedValue2 > 15 && splitedValue2 <= 30) { 
        int rounded = splitedValue2 > 22 ? (30) : (15); 
        return splitedValue1 + "." + rounded; 
    } 
    if (splitedValue2 > 30 && splitedValue2 <= 45) { 
        int rounded = splitedValue2 > 37 ? (45) : (30); 
        return splitedValue1 + "." + rounded; 
    } 
    if (splitedValue2 > 45 && splitedValue2 <= 59) { 
        int rounded = splitedValue2 > 51 ? (00) : (45); 
        if (rounded == 00) { 
         splitedValue1++; 
         return splitedValue1 + "." + rounded; 
        } else { 
         return splitedValue1 + "." + rounded; 
        } 
    } 
    return ""; 
    

    }

+0

我使用了一些計算,但沒有鍛鍊它們。 – user2576816

+0

什麼是這裏使用的「時間實例」,「long epoch」,「Date」,「LocalDate」,「Calendar」,...四捨五入通常使用模運算符完成。顯示你有什麼,以幫助你在那一部分 – AxelH

+0

這是現在即時通訊使用的類, – user2576816

回答

1

如果你只是可以從時間中提取分鐘,並將它傳遞給這個函數:

public static int getNear15Minute(int minutes){ 
     int mod = minutes%15; 
     int res = 0 ; 
     if((mod) >=8){ 
      res = minutes+(15 - mod); 
     }else{ 
      res = minutes-mod; 
     } 
     return (res%60); 
    } 

這裏我假設數字大於或等於8接近15.

0

示例使用當前Date

import java.util.Calendar; 
import java.util.Date; 

public class Main { 
    public static void main(String[] args) { 
     Calendar calendar = Calendar.getInstance(); 
     calendar.setTime(new Date()); 
     int round = calendar.get(Calendar.MINUTE) % 15; 
     calendar.add(Calendar.MINUTE, round < 8 ? -round : (15-round)); 
     calendar.set(Calendar.SECOND, 0); 
     System.out.println(calendar.getTime()); 
    } 
} 

測試

Tue Jan 03 09:15:00 CET 2017 

Online demo

+0

這是使用'日曆'而不是'日期',用'日期',你應該做'timeInMilli - (timeInMilli%(15 * 60 * 1000))'我想。 PS:'Calendar.getInstance()'已經在做'new Date()',所以不需要再重做;) – AxelH

0

好,四捨五入很容易與模操做。

在這裏你想圓到15分鐘。

使用以毫秒爲單位的時代的時候,你只需要刪除模操作的其餘部分是這樣的:

long l = System.currentTimeMillis(); 
l -= l % (15*60*1000); 


System.out.println(new Date(System.currentTimeMillis())); 
System.out.println(new Date(l)); 

週二年1月3 9點35分56秒CET 2017年

星期二一月03 09:30:00 CET 2017年

15*60*1000簡直是毫秒的15分鐘

如果需要,您只需檢查餘下的值以添加15分鐘。 所以只存儲餘:

long r = l % (15*60*1000); 

然後它。減去當前的時間

l -= r; 

並檢查分鐘數(取決於你真正想要的精度

if(r/60_000 >= 8) 
    l += 15*60*1000; 

。如果季度從8分鐘過去(如果這真的意味着英語中的任何內容;)),這將整理起來)

Full code:

long l = System.currentTimeMillis(); 
long r = l % (15*60*1000); 
l -= r; 
if(r/60_000 >= 8) 
    l += 15*60*1000; 
相關問題