如何在java

时间:2017-01-03 07:52:33

标签: java time rounding

我的计划需要计算工人的加班时间以进行工资计算。为此,我现在正在做的是获得工人的时间和时间,然后我用公司的时间表来计算并计算每个工人加班的时间。我需要将这些时间缩短到最近的15分钟,所以我需要一个班级来传递时间并返回四舍五入的时间。

例如:

  • 如果加班时间为2.17小时,则必须四舍五入为2.15。
  • 如果加班时间为2.24小时,则必须四舍五入为2.30。
  • 如果加班时间是2.40小时,则必须是2.45。
  • 如果加班时间为2.56小时,则必须为3小时。

    public String 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 "";
    

    }

3 个答案:

答案 0 :(得分: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。

答案 1 :(得分: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

答案 2 :(得分:0)

好吧,使用模运算可以很容易地进行舍入。

在这里你想要回合15分钟。

使用以毫秒为单位的纪元时间,您只需要删除模运算的其余部分,如下所示:

<div id="myCarousel" class="carousel slide" data-ride="carousel">
<!-- Indicators -->
    <ol class="carousel-indicators">
        <li data-target="#myCarousel" data-slide-to="0" class="active"></li>
        <li data-target="#myCarousel" data-slide-to="1"></li>
    </ol>

<!-- Wrapper for slides -->
    <div class="carousel-inner" role="listbox">
        <div class="item active">
            <img src="img/main.jpg" alt="Image">
            <div class="carousel-caption">

            </div>
        </div>

        <div class="item">
            <img src="img/main2.jpg" alt="Image">
            <div class="carousel-caption">

            </div>
        </div>

    </div>
</div>
  

2017年1月3日星期二09:35:56

     

2017年1月3日星期二09:30:00 CET

long l = System.currentTimeMillis(); l -= l % (15*60*1000); System.out.println(new Date(System.currentTimeMillis())); System.out.println(new Date(l)); 只是15分钟内的毫秒数

如果需要,您只需要检查余数的值,即可添加15分钟。 所以只需存储余数:

15*60*1000

然后将其减去当前时间

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

并检查分钟数(取决于你真正想要的精度。

l -= r;

如果季度从8分钟过去(如果这真的意味着英语中的任何内容),这将会四舍五入。)

完整代码:

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