如何对跨当月月末至下月初的日期序列按实际业务时序重排
跨月日期序列排序优化方案
原代码问题分析
原有代码外层冗余遍历@fdaylist数组,每遍历一个元素就重复执行一次拼接逻辑,因此会生成大量重复值,必须调用uniq()去重,属于不必要的性能损耗。
优化实现思路
针对固定处理9天的业务场景,跨月场景的核心特征是排序后的日期数组中同时存在小于等于12的小月日期和大于等于20的大月日期,不会出现判定歧义。判定为跨月后只需按分割点拆分数组再重新拼接即可。
优化后代码
use List::Util qw(firstidx); # 先对原始日期数组做数值升序排序 my @sorted = sort { $a <=> $b } @fdaylist; # 跨月场景判定(适配9天固定处理周期,无判定冲突) my $has_small_date = grep { int($_) <= 12 } @sorted; my $has_large_date = grep { int($_) >= 20 } @sorted; my @fday; if ($has_small_date && $has_large_date) { # 找到第一个大月日期的索引作为分割点 my $split_index = firstidx { int($_) > 15 } @sorted; # 大月日期段拼接到小月日期段前 @fday = ( @sorted[$split_index .. $#sorted], @sorted[0 .. $split_index - 1] ); } else { # 非跨月场景直接使用排序结果 @fday = @sorted; }
方案优势
- 无冗余循环,不会生成重复值,无需额外去重处理
- 完全适配所有9天周期的跨月场景,包含2月平年/闰年的特殊情况
- 逻辑简洁,执行效率远高于原有实现
内容的提问来源于stack exchange,提问作者Zilore Mumba
相关产品推荐
相关产品推荐

