5

開始時間(S)と終了時間(E)で表される時間の「期間」(P)があります。PをサイズDのCチャンクに分割したい。つまり、

P = C * D + R、ここでRは余りまたは残り時間です。

例えば。

S = NOW, E = 10 sec after NOW, D = 3 sec.
Therefore, P = 10 sec, C = 3, R = 1 sec. 

すべてのチャンクCを、開始時刻、終了時刻、およびサイズとともに保存および表示したいと思います。最後に、残りを保存して表示したいと思います。Joda Timeを使用してこれを行うにはどうすればよいですか?

APIはこれを行うための単純なメソッドとクラスを提供しますか、それとも私は方法を理解する必要がありますか?

この質問は、私がここに投稿した別の質問のごく一部です。

4

4 に答える 4

11

このコードがあなたが探しているものであるかどうかはわかりませんが、それはあなたを正しい軌道に乗せるかもしれません。

Joda-Time期間は1か月や2週間のような期間を表すため、開始日と終了日を表す2つのDateTimeがあると仮定しました。たとえば、2つの瞬間の間の時間のスライスを表す間隔など、特定の開始または終了はありません。

import java.util.*;
import org.joda.time.*;

class Test {
    public static void main(String... args) {
        DateTime now = new DateTime();
        List<Interval> list = splitDuration(now, now.plusSeconds(10), 3, 3 * 1000);

        for(Interval i : list) {
            System.out.println(i.getStart() + " - " +
                               i.getEnd() + " - " +
                               i.toDurationMillis());
        }
    }

    static List<Interval> splitDuration(DateTime start, DateTime end, long chunkAmount, long chunkSize) {
        long millis = start.getMillis();
        List<Interval> list = new ArrayList<Interval>();

        for(int i = 0; i < chunkAmount; ++i) {
            list.add(new Interval(millis, millis += chunkSize));
        }

        list.add(new Interval(millis, end.getMillis()));
        return list;
    }
}

私の場合の出力:

2013-03-12T12:29:01.781+01:00 - 2013-03-12T12:29:04.781+01:00 - 3000
2013-03-12T12:29:04.781+01:00 - 2013-03-12T12:29:07.781+01:00 - 3000
2013-03-12T12:29:07.781+01:00 - 2013-03-12T12:29:10.781+01:00 - 3000
2013-03-12T12:29:10.781+01:00 - 2013-03-12T12:29:11.781+01:00 - 1000
于 2013-03-12T11:31:18.913 に答える
0

この場合、私はこれを行うことで終わりました:

private static Collection<Interval> splitDuration(Interval interval, int chunks)
{
    long startMillis = interval.getStartMillis();
    long endMillis = interval.getEndMillis();
    long durationMillis = endMillis - startMillis;
    long chunkSize = durationMillis / chunks;

    Collection<Interval> list = new ArrayList<Interval>();
    for (int i = 1; i <= chunks; ++i) {
        list.add(new Interval(startMillis, startMillis += chunkSize));
    }

    return list;
}

要旨

乾杯!

于 2016-10-11T09:21:42.700 に答える
0

ある人が与えられた時間の間に等しい分母を探している場合、ここにコードがあります

`

private List<Interval> splitDateTime(long start, long end, int intervalNo) {
        long interval = (end - start) / intervalNo;
        List<Interval> list = new ArrayList<Interval>();
        for (long i = start + interval; i < end; i += interval) {
            list.add(new Interval(start, i));
            start=start + interval;
        }
        list.add(new Interval(start, end));
        return list;
    }

`

于 2017-11-13T12:38:39.600 に答える
0

最後に残ったチャンクを失うことのないKotlinバリアント:

/**
 * Splits [Interval] with passed [duration] and returns a list of [Interval]s. The minimum supported duration is a second.
 */
fun Interval.splitBy(duration: Duration): List<Interval> {
    val durationSec = duration.standardSeconds
    val periodSec = toPeriod().toStandardSeconds().seconds
    val chunks = ceil((periodSec / durationSec.toFloat())).toInt()
    var nextStart = start
    return List(chunks) { index ->
        val seconds = if (index < chunks - 1) {
            durationSec
        } else {
            val remainder = periodSec % durationSec
            if (remainder > 0) periodSec % durationSec else durationSec
        }
        Interval(nextStart, nextStart.plusSeconds(seconds.toInt()).also { nextStart = it })
    }
}
于 2020-11-26T22:57:47.910 に答える