我有一个问题,我有一个日期范围,我想将日期范围分成块(用户提供的数量)。每个块必须是整个月的连续范围。最长的块必须等于或比最短的长一个月。
日期范围也是整月:
您可以假设输入范围足够大,每个块至少可以有一个月。
例如,考虑日期范围为1/1/2000到8/31/2000的简单情况,请求8个块。然后每个块都会整整一个月。
更容易想到这个问题的方法如下 考虑1-15的数字列表 我们想把它们分成8个块 可能的组合是
(1),(2),(3),(4),(5),(6),(7),(8,9,10,11,12,13,14,15) -> satisfies only one constraints of using up all the chunks
(1,9),(2,10), (3,11), (4,12), (5,13), (6,14), (7,15), (8) ---> satisfies only 1 constraint of minimizing the difference between maximum number and minimum numbers in a chunk.
(1,2), (3,4), (5,6), (7,8) (9,10), (11,12) (13,14), 15 ---> correct
我认为joda时间是日期库。
这不是作业问题。我试图并行化一个以日期范围为输入的查询。这些块应该是核心,我想在核心的后续日期范围内运行查询。
答案 0 :(得分:1)
这不是一个难题。有一个简单的结构来完成这项工作。首先,请注意你不关心几天,只有整整几个月。
m1/d1/y1
(开始)和m2/d2/y2
(结束)。 m_range = 12*(y2-y1) + m2-m1 + 1
。chunk
。如果m_range < chunk
,则输入无效。min_size = floor(m_range/chunk)
(截断分割)。最大尺寸是一个。extra = m_range mod chunk
。使用这些参数,分配很简单:第一个extra
块每个额外获得一个月,并且大小为min_size+1
。剩余的chunk-extra
块每个min_size
个月。
例如,让我们采取一个范围1/1/2017 - 5/31/2018,以及4个块。
m_range = 12*(2018-2017) + (5-1) + 1 = 12 + 4 + 1 = 17
min_size = floor(m_range/chunk) = floor(17/4) = 4
extra = m_range mod chunk = 1
所以,你给第一个大块5个月;其他3个大块各4个月。
个人日期操作留给学生练习。 : - )
答案 1 :(得分:0)
给定日期范围计算该范围内的天数。我不熟悉joda数据库,也许它可以做到这一点。如果没有,我从头开始这样做,我会写一个执行此操作的功能(硬编码日历,1月31日,2月28日等)。如果相关,请注意闰年。
获得总时间范围内的天数后,将该数字除以块数。现在你有多少天应该在每个块中。然后从第一个日期开始构建您的间隔,并在其中添加表示“每个块中的天数”的数字。有时间隔将在一个月内开始,并在未来一个月结束,这是您需要使用库或硬编码的参考来确定每月的天数。
希望这有帮助。
编辑:请参阅下面的评论,了解有助于提供帮助的功能的链接。
Edit2:这个答案在我做出这个回复之后看到问题的编辑方式并没有多大帮助。但是我评论中链接的功能仍然有用。