我有一个时间段(P),由开始时间(S)和结束时间(E)表示。 我想把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是否提供了简单的方法和类来执行此操作,或者我必须找到出路?
这个问题只是我发布的另一个问题的一小部分here
答案 0 :(得分:10)
我不确定这段代码是否符合您的要求,但它可能会让您走上正轨。
我假设你有两个DateTime来表示开始和结束日期,因为Joda-Time Period代表一段时间,比如1个月或2个星期。它没有特定的开始或结束,例如Interval代表两个时刻之间的一段时间。
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
答案 1 :(得分: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;
}
干杯!
答案 2 :(得分: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;
}
`
答案 3 :(得分: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 })
}
}