如何在 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)
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 类取代。
该LocalDate
级表示没有时间一天和不同时区的日期,唯一的价值。
时区对于确定日期至关重要。对于任何给定时刻,日期因地区而异。例如,在法国巴黎午夜过后几分钟是新的一天,而在魁北克蒙特利尔仍然是“昨天” 。
以、、 或等格式指定正确的时区名称。永远不要使用 3-4 个字母的缩写,例如或因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。continent/region
America/Montreal
Africa/Casablanca
Pacific/Auckland
EST
IST
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 8和更高版本。这些类取代了麻烦的旧的遗留日期时间类,例如java.util.Date
, Calendar
, & SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参阅Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。规范是JSR 310。
从哪里获得 java.time 类?
该ThreeTen-额外项目与其他类扩展java.time。该项目是未来可能添加到 java.time 的试验场。你可能在这里找到一些有用的类,比如Interval
,YearWeek
,YearQuarter
,和更多。
归档时间: |
|
查看次数: |
6646 次 |
最近记录: |