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

在Java中生成两个时间/日期之间的特定间隔,java,time,intervals,localtime,Java,Time,Intervals,Localtime,我想在两个给定的日期/时间之间生成间隔。 例如,对于24小时格式HH:MM,我有两个端点,00:00和11:51,假设我想将其划分为24个部分。所以我的计算是这样的: (hour * 3600 + min * 60) / 24 如果我使用calendar.addCalendar.SECOND,hour*3600+min*60/24,则我的日期/时间错误。我的计算是双精度的,我认为calendar.add不支持双精度。就好像28.883等于29 本质上我想要这样的东西: 现在:15:57 今天开

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

(hour * 3600 + min * 60) / 24
如果我使用calendar.addCalendar.SECOND,hour*3600+min*60/24,则我的日期/时间错误。我的计算是双精度的,我认为calendar.add不支持双精度。就好像28.883等于29

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

现在:15:57 今天开始:00:00 24小时 输出:00:00,00:47.85,…,15:57


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

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

这样,您通过除以24或其他方式得到的算术错误不会累加。

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

下一个问题是Calendar.addint字段int amount只接受整数作为第二个参数。当然,如果将Calendar.SECOND作为第一个参数传递,则精度不高于秒。您可以使用Calendar.millis秒来获得更高的精度

但是,我建议使用新的Java日期和时间API,而不是旧的API:

这是一个变体。我想把数学留给图书馆的课。Duration的方法分为两部分,我们可以利用这两部分来发挥优势

    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个片段在一分钟内平均分为纳秒数。再加上一些,你就可以决定是否值得担心这些微小的误差了。如果是的话,对于每个分区时间,先乘后除。

我不太明白。首先,您应该使用Java8引入的新的日期时间api,而不是旧的。然后你需要意识到你应该使用你想要精确到的最小时间单位,也就是说,如果你想精确到秒,那么28.883秒就不能用了,你需要把它四舍五入到29或截断到28。如果你真的需要883毫秒,那么就用毫秒作为基本时间单位——但是你真的需要这个精度吗?你想用它实现什么?实际上我是因为我想在00:00到现在的小时:分钟之间绘制折线图。我有24个列表项。在折线图中,我把它们分成6部分。所以日期显示错误。你应该提供一个更详细的例子,说明你想要的确切日期和你得到的日期。正如我所说,如果你使用的是秒精度,那么28.883秒就不能用了——它必须是28或29秒。如果问题是错误像rghome疑犯一样累积,那么按照他的建议去做。非常感谢
    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));