在Java中生成两个时间/日期之间的特定间隔

问题描述 投票:0回答:3

我想生成两个给定日期/时间之间的间隔。 例如,对于24小时格式(HH:MM),我有这两个端点,00:00和11:51,并假设我想将它分成24块。所以我的计算是这样的:

(hour * 3600 + min * 60) / 24

如果我使用calendar.add(Calendar.SECOND, (hour * 3600 + min * 60) / 24),我的日期/时间错误。我的计算是双倍的,我认为calendar.add()不支持双倍。就像它将28.883视为29。

本质上我想要这样的东西:

现在:15:57 今天开始:00:00(24hh) 输出:00:00,00:47.85,...,15:57

java time intervals localtime
3个回答
1
投票

您的代码的实际问题是您正在执行整数除法。我假设hourmin都被定义为整数类型。公式(hour * 3600 + min * 60) / 24总是产生整数类型。如果将代码更改为(hour * 3600 + min * 60) / 24d,则表达式至少会生成浮点值。

确实下一个问题是Calendar.add(int field, int amount)只接受一个整数作为第二个参数。当然,如果您将Calendar.SECOND作为第一个参数传递,那么您的精度不会高于秒。您可以使用Calendar.MILLISECOND来获得更高的精度。

但是,我建议使用新的Java Date and Time API,而不是troublesome旧API:

LocalTime startTime = LocalTime.of(0, 0);
LocalTime endTime = LocalTime.of(11, 51);
long span = Duration.between(startTime, endTime).toNanos();

final int n = 23; // Number of pieces
LongStream.rangeClosed(0, n)
    .map(i -> i * span / n)
    .mapToObj(i -> startTime.plusNanos(i))
    .forEach(System.out::println);

0
投票

您需要将开始日期保存在日历对象中,然后在生成每个分区时使用以下公式:

startCalendar.add(Calendar.Second, count * (hour * 3600 + min * 60) / 24))

这样,通过除以24(或其他)获得的算术误差不会累积。


0
投票

这是MC Emperor’s fine code的变种。我想把数学留给库类。 Duration有我们可以利用的方法dividedBymultipliedBy

    LocalTime startTime = LocalTime.of(0, 0);
    LocalTime endTime = LocalTime.of(11, 51);

    final int n = 24; // Number of pieces
    Duration piece = Duration.between(startTime, endTime).dividedBy(n);
    LocalTime[] partitionTimes = IntStream.rangeClosed(0, n)
        .mapToObj(i -> startTime.plus(piece.multipliedBy(i)))
        .toArray(LocalTime[]::new);
    System.out.println(Arrays.toString(partitionTimes));

输出:

[00:00, 00:29:37.500, 00:59:15, 01:28:52.500, 01:58:30, 02:28:07.500, 02:57:45, 03:27:22.500, 03:57, 04:26:37.500, 04:56:15, 05:25:52.500, 05:55:30, 06:25:07.500, 06:54:45, 07:24:22.500, 07:54, 08:23:37.500, 08:53:15, 09:22:52.500, 09:52:30, 10:22:07.500, 10:51:45, 11:21:22.500, 11:51]

是否存在舍入问题?由于24分钟的开始时间为24分钟,因此24分钟内的分数均匀分为纳秒数。使用另一部分,您可以决定是否值得担心轻微的不准确性。如果是,则在划分之前将每个分区时间相乘。

© www.soinside.com 2019 - 2024. All rights reserved.