2017-01-03 124 views
0

私のプログラムでは、給与計算のために労働者の残業時間を計算する必要があります。この目的のために、私が今やっているのは、従業員の起床時間と出勤時間を取得してから、会社の時間スケールで計算して、各従業員の残業時間を取得します。私はこれらの時間を最も近い15分に丸める必要があるので、時間を過ごし、丸められた時間を返す授業が必要です。例えばjavaで最も近い15分に時間を丸める方法

  • 残業時間の場合は、それが2.15に丸めなければなりません2.17時間です。
  • 残業時間が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

これは 'Date'ではなく' Calendar'を使って '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)); 

火1月3日午前9時35分56秒CET 2017

火ヤン2017

15*60*1000 03 9時30分00秒CETは、単純に15分

のミリ秒数です

必要に応じて15分を追加するには残りの値をチェックするだけです。 は、だから余り格納します。その後

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

を現在の時刻

l -= r; 

にそれをsubstractと分の数を確認します(あなたが本当に望んでいるの精度に依存

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; 
関連する問題