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

时间:2019-03-27 08:59:23

标签: java time intervals localtime

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

(HH:MM)

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

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

  

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

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

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

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

这样一来,您除以24(或其他任何数值)所得到的算术误差就不会累积。

答案 2 :(得分: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分钟可以将一分钟的平均时间平均分为十亿分之一秒。对于其他零件,您可能会决定是否值得担心轻微的误差。如果是这样,则在划分之前,请为每个分区时间乘以