2017-01-03 4 views
0

Моя программа должна рассчитать периоды сверхурочных рабочих для расчета зарплаты. С этой целью то, что я делаю сейчас, - это время рабочего времени рабочего и время, а затем я рассчитываю с помощью шкал времени компании и получаю, сколько часов сверхурочно каждый рабочий. Мне нужно округлить эти моменты до ближайших 15 минут, поэтому мне нужно пройти класс в часы и вернуться в округлые часы.Как округлить время до ближайшей 15 минут в java

Например:

  • если сверхурочные часы в 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

Что такое «экземпляр времени», используемый здесь: «длинная эпоха», «дата», «локальная дата», «календарь», ... округление обычно выполняется с помощью оператора modulo. Покажите, что у вас есть, чтобы помочь вам в этой части. – 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()); 
    } 
} 

Test

Tue Jan 03 09:15:00 CET 2017 

Online demo

+0

Это использование 'Calendar', а не' Date', с 'Date', вы должны сделать' 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)); 

Вт Янв 03 09:35:56 CET 2017

Вт Янв 03 9:30:00 CET 2017

15*60*1000 просто количество миллисекунд в 15minutes

Вам просто нужно проверить значение остатка, чтобы добавить 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;