2016-05-09 12 views
1

この質問は数学の問題です(申し訳ありませんが、私は数学では良くありません)。整数時間間隔

私は例

700 (means 7:00) 

1330 (means 13:30) 

2359 (means 23:59) 

のために整数

として表される時間を持っているI開始時間と終了時間を持っており、それらの間の15分の間隔を作成したいです。たとえば、

int start = 700; 
int end = 1300; 

開始時間を15分増やして60分を超えて次の100分にジャンプします。例えば700、715、730、745、800、815、830 ..等

IはCalendarオブジェクトを作成することによって、これを作成しSimpleDateFormatとして整数を解析し、カレンダーに時間を追加し、分を増加させ、でき時間と分を解析して整数に戻します。しかし、それを行うには時間がかかりすぎるので、これをより効率的に実行するための簡単な数学的方法が必要です。

答えて

2

で整数を使用する必要があります。同様に、 "toEncoded" 方法 "toMinutes" を作成することです

public int plusMinutes (int time, int minutes) { 
    int auxMinutes = time % 60; 
    auxMinutes += minutes; 
    time += 100 * (seconds/60); 
    time = 100 * (time/100); // set the last 2 digits to 0 
    time += auxMinutes % 60; 

    return time; 
} 

別のオプション(私の意見では、より良い)と方法:

public int toMinutes (int encoded) { 
    int minutes = encoded % 100; 
    minutes += (encoded/100) * 60; 
    return minutes; 
} 

public int toEncoded (int minutes) { 
    int encoded = minutes % 60; 
    encoded += (minutes/60) * 100; 
    return encoded; 
} 

のような、メソッド "plusMinutes" を作成することができます注:コードが機能するかどうかは100%ではありませんが、テストはしていませんが、一般的な考え方を得るべきです。

EDIT:そして最後のオプションを使用している場合、あなたの問題のために、あなただけのような何かをする必要があります:

int encoded = 1330; 
int plusMinutes = 45; 

int minutes = toMinutes(encoded); 
minutes += plusMinutes; 

encoded = toEncoded(minutes); 
+0

おかげで、その私がそれを望む方法。分を加えてエンコードされたものに戻す – fareed

4

LocalTimeクラスを使用してください。これには、基本時間を15分増やすために使用できるplusMinutesメソッドがあります。

はたぶん

LocalTime baseTime = LocalTime.of(((int)myNumber/100),myNumber%100); 
while(...){ 
    LocalTime myTime=baseTime.plusMinutes(15); 
} 
3

のようなものは、分に、 "エンコードされた整数" の時間を変換するには:

long milliseconds = minutes * 3_600_000L; 
:あなたは分を持っていたら、あなたは数分、またはミリ秒を追加することができます

int encoded = 2359; 
int minutes = (encoded/100) * 60 + encoded % 100; 

0

すでにかなりいくつかの良い答えがありました。

APIの観点からは、user1717259が示すように、日付と時刻のAPIを使用する必要があります。これは時間の「計算」に最適なオプションを提供します。これは、最も自明で保守的なコードを生成します。

時間エンコードされたintから分と時間を計算するための良い提案もあります。int Sを使用することが制約され、あなただけの特定の開始値と間隔については、次のintを計算したい

場合は、以下の機能が

int inc(int currentTime, int interval) { 
    return (((currentTime +interval)/100) + ((currentTime+interval) % 100/60)) * 100 + ((currentTime+interval) % 100 % 60); 
} 

機能について説明を助けるかもしれない:

  • currentTime+intervalがあなたの間隔を増やしている場合は、currentTime += intervalの別のコールで置き換えることもできます。
  • (currentTime +interval)/100)もしあなたが時間やない
  • * 100を超えた場合hh00フォーマットへ
  • ((currentTime+interval) % 100 % 60)を時間値を再計算します
  • ((currentTime+interval) % 100/60))はあなた0または1取得する時間が時間をオーバーラップ分を計算します、% 100はあなたを取得します分は、% 60はあなたが

    と機能をテストすることが

新しい時間の値に加算される時間の上にあなたの分を取得します(

for(int i = 700; i <= 1300; i = inc(i, 15)){ 
    System.out.println(i); 
} 

このソリューションでは、40分(なぜなら%の100%60)よりも大きな間隔では動作しません...多分誰かがその1つの問題を解決したい:)

2

このための魔法の公式はあります( J =%100 + 15)%60)+((I/100 + J/60)* 100)

for(int i = 700, j; i <= 1300; i=((j=i%100+15)%60)+((i/100+j/60)*100)){ 
    System.out.println(i); 
} 

出力:

700 
715 
730 
745 
800 
815 
... 
1300 
+0

印象的な、単一の式!よくやった – fareed