在java中如何将时间舍入到最接近的15分钟

在java中如何将时间舍入到最接近的15分钟,java,time,rounding,Java,Time,Rounding,我的程序需要计算工人的加班时间,以便计算工资。为此,我现在要做的是让员工的时钟按时下班,然后根据公司的时间刻度计算每个员工加班的时间。我需要将这些时间四舍五入到最接近的15分钟,因此我需要一节课来通过小时数并返回四舍五入的小时数 例如: 如果加班时间为2.17小时,则必须四舍五入至2.15小时 如果加班时间为2.24小时,则必须四舍五入至2.30小时 如果加班时间为2.40小时,则必须为2.45小时 如果加班时间为2.56小时,则必须为3小时 公共字符串最长15分钟(长时间){ long mi

我的程序需要计算工人的加班时间,以便计算工资。为此,我现在要做的是让员工的时钟按时下班,然后根据公司的时间刻度计算每个员工加班的时间。我需要将这些时间四舍五入到最接近的15分钟,因此我需要一节课来通过小时数并返回四舍五入的小时数

例如:

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

    公共字符串最长15分钟(长时间){

    long milsec=时间;
    System.out.println(“毫秒:+milsec”);
    长秒=时间/1000;
    ValidateValues.roundupDouble(秒);
    System.out.println(“第二个:“+sec”);
    双分钟=秒/60;
    ValidateValues.roundupDouble(最小值);
    System.out.println(“miniutes:+min”);
    双小时=分钟/60;
    系统输出打印项次(“小时数:+hrs”);
    double roundeVal=ValidateValues.roundupDouble(小时);
    字符串hrsvalue=String.valueOf(roundeVal);
    System.out.println(HRS值);
    字符串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]);
    如果(拆分值27?(15):(0);
    返回拆分值1+“+”四舍五入;
    }
    如果(分割值2>15&&splitedValue2 22?(30):(15);
    返回拆分值1+“+”四舍五入;
    }
    如果(分割值2>30&&splitedValue2 37?(45):(30);
    返回拆分值1+“+”四舍五入;
    }
    如果(分割值2>45&&splitedValue2 51?(00):(45);
    如果(四舍五入==00){
    splitedValue1++;
    返回拆分值1+“+”四舍五入;
    }否则{
    返回拆分值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; //return rounded minutes
    }

这里我假设大于或等于8的数字接近15。

使用当前
日期的示例

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());
    }
}

嗯,用模运算进行舍入很容易

在这里,您需要轮到15分钟

使用以毫秒为单位的历元时间,只需删除剩余的模运算,如下所示:

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


System.out.println(new Date(System.currentTimeMillis()));
System.out.println(new Date(l));
2017年1月3日星期二09:35:56 CET

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

15*60*1000
只是15分钟内的毫秒数

如果需要,您只需检查余数的值以添加15分钟。 因此,只需存储剩余部分:

long r = l % (15*60*1000);
然后将其减去当前时间

l -= r;
并检查分钟数(取决于您真正想要的精度)

if( r / 60_000 >= 8)
     l += 15*60*1000;
如果季度从8分钟后结束(如果这在英语中真的意味着什么;),则此项将结束)

完整代码:

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

我使用了一些计算,但没有计算。什么是“时间实例”在这里使用,
long epoch
Date
LocalDate
Calendar
,…取整通常是用模运算符完成的。显示您所拥有的,为了帮助您完成这一部分,这是我现在使用的类,我不会单击该链接,用代码中有趣的部分编辑您的问题。不需要完整的项目,只需要你试图将时间四舍五入到季度的方法。整理、格式化和更正英语。那就是使用
Calendar
而不是
Date
,使用
Date
,你应该做一个
timeInMilli-(timeInMilli%(15*60*1000))
我想。PS:
Calendar.getInstance()
已经在做一个
新日期()
因此无需再次执行;)
if( r / 60_000 >= 8)
     l += 15*60*1000;
long l = System.currentTimeMillis();
long r = l % (15*60*1000);
l -= r;
if( r / 60_000 >= 8)
     l += 15*60*1000;