2017-01-03 151 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; 
相关问题