如何在Java中找到一个月的最后一个工作日

Dev*_*ika -5 java android

如何在 Java 中找到一个月的最后一个工作日。如果一个月的最后一天是星期六或星期日,则最后一个工作日应该是星期五。例如,如果 3 月 31 日是星期日,则最后一个工作日是 3 月 29 日星期五。

获取当前月份

Date today = new Date();
Calendar calendar = Calendar.getInstance();
calendar.setTime(today);
calendar.add(Calendar.MONTH, 1);
Run Code Online (Sandbox Code Playgroud)

Bas*_*que 5

tl;博士

LocalDate.now( ZoneId.of( "America/Montreal" ) )                     // Today
         .with( TemporalAdjusters.firstDayOfNextMonth() )            // First of next month.
         .with( org.threeten.extra.Temporals.previousWorkingDay() )  // Move backwards in time, looking for first day that is not Saturday nor Sunday.
Run Code Online (Sandbox Code Playgroud)

避免遗留类

您正在使用麻烦的旧日期时间类,现在是遗留的,由 java.time 类取代。

Java 中的日期时间类型表,包括现代的和传统的。

使用 java.time

LocalDate级表示没有时间一天和不同时区的日期,唯一的价值。

时区对于确定日期至关重要。对于任何给定时刻,日期因地区而异。例如,在法国巴黎午夜过后几分钟是新的一天,而在魁北克蒙特利尔仍然是“昨天” 。

以、、 或等格式指定正确的时区名称。永远不要使用 3-4 个字母的缩写,例如或因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。continent/regionAmerica/MontrealAfrica/CasablancaPacific/AucklandESTIST

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );
Run Code Online (Sandbox Code Playgroud)

TemporalAdjuster界面提供了一种调整日期时间值的方法。在TemporalAdjusters类(注意是复数s)提供了一些方便的实现。

LocalDate endOfMonth = today.with( TemporalAdjusters.lastDayOfMonth() );
Run Code Online (Sandbox Code Playgroud)

ThreeTen-EXTRA项目扩展附加功能java.time。这包括更多的TemporalAdjuster实现。其中之一是previousWorkingDay跳过周六和周日。要使用它,我们需要越过月末,因为那一天本身可能是一个工作日。

LocalDate previousWorkingDay = endOfMonth.plusDays( 1 ).with( org.threeten.extra.Temporals.previousWorkingDay() );
Run Code Online (Sandbox Code Playgroud)

关于 java.time

java.time框架是建立在Java 8和更高版本。这些类取代了麻烦的旧的遗留日期时间类,例如java.util.Date, Calendar, & SimpleDateFormat

现在处于维护模式Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。规范是JSR 310

从哪里获得 java.time 类?

ThreeTen-额外项目与其他类扩展java.time。该项目是未来可能添加到 java.time 的试验场。你可能在这里找到一些有用的类,比如IntervalYearWeekYearQuarter,和更多