java.time - 是否有函数可以查找两天之间特定日期(星期几或月中的某天)的编号?

java.time - Is there a function to find number of a specific day (day of week, or day of month) between two days?

那么是否有一个函数或其他东西,你可以给出两个日期和一周中的某一天 (例如星期六) 并且它 returns 之间星期六的数量两个约会?

尝试使用 ChronoUnit.WEEKS.between 并将结果除以 7 的问题在于,如果你有 4 这样的东西,它就不会起作用(因为它不是整周),或 10(因为它会被计算在内作为一周).

另一个想法可能是使用一个循环来检查某一天是否是星期六,但这种方式对于大时间范围来说效率低下且速度慢。

类似的函数怎么样,但不是星期几,它计算一个月中某一天的出现次数 (例如任何一个月的第 15 天),或某一天年份 (例如任何一年的 4 月 4 日).

如果没有这样的函数,什么是有效的方法?

正如其他人评论的那样,您需要编写自己的代码。但是 java.time 和 Java 流可以帮助您完成大部分工作。

LocalDate::datesUntil 方法生成一个 LocalDate 对象流。测试每个 DayOfWeek。收集命中。

类似于这个未经测试的示例代码。

ZoneId z = ZoneId.of( "America/Montreal" ) ;
LocalDate start = LocalDate.now( z ) ;
LocalDate then = today.plusDays( 177 ) ;
Stream < LocalDate > dates = start.datesUntil( then ) ;
List < LocalDate > saturdays = 
        dates
        .filter( 
            date -> 
                date
                .getDayOfWeek()
                .equals( DayOfWeek.SATURDAY ) 
        )
        .collect( 
            Collectors.toList()
        )
; 

您表达了对效率的担忧。我怀疑您正在陷入过早优化的陷阱。你的应用真的一整天都在每分钟执行数千次这样的操作吗?如果不是,性能可能不是问题。

永远先写简单明了的代码。然后使用 Microbenchmarks Suite 和分析器进行经验性测试,看看您的担忧是否成立。