使用java指向上一个工作日

我是使用java.calendar.api的新手。 我想指出使用java的某一天的前一个工作日。 但是当我使用calendar.api来操纵日期时条件会继续增加,因为我必须考虑通常的周末和指向上个月,而且我还要考虑我所在地区的地区假期……

例如:说我必须考虑美国假期并指出前一天。

有什么办法可以定义我自己的日历并使用它,以便日期操作能够感知所有那些常见的变化吗?

虽然您应该考虑使用Joda Time库,但这里是Java Calendar API的开始:

public Date getPreviousWorkingDay(Date date) { Calendar cal = Calendar.getInstance(); cal.setTime(date); int dayOfWeek; do { cal.add(Calendar.DAY_OF_MONTH, -1); dayOfWeek = cal.get(Calendar.DAY_OF_WEEK); } while (dayOfWeek == Calendar.SATURDAY || dayOfWeek == Calendar.SUNDAY); return cal.getTime(); } 

这只考虑周末。 您必须添加额外的检查才能处理您考虑假期的日子。 例如,您可以添加|| isHoliday(cal) || isHoliday(cal)while条件。 然后实现该方法,如:

 public boolean isHoliday(Calendar cal) { int year = cal.get(Calendar.YEAR); int month = cal.get(Calendar.MONTH) + 1; int dayOfMonth = cal.get(Calendar.DAY_OF_MONTH); if (month == 12 && dayOfMonth == 25) { return true; } // more checks return false; } 

考虑使用Joda Time以及您所在地区的区域假日列表。

TL;博士

 LocalDate.now ( ZoneId.of ( "America/Montreal" ) ) .with ( org.threeten.extra.Temporals.previousWorkingDay () ) 

java.time

Java 8及更高版本内置了java.time框架。 灵感来自Joda-Time ,由JSR 310定义,并由ThreeTen-Extra项目扩展。

这些新类取代了与最早版本的Java java.util.Date/.Calendar捆绑在一起的臭名昭着的旧日期时间类。 尽可能避免使用旧课程。 必须接口时查找新添加的转换方法,以便在大多数工作中切换到java.time。 此外,Joda-Time的制造商告诉我们尽快转移到java.time。

java.time的基础知识… Instant是UTC时间轴上的一个时刻。 应用时区( ZoneId )以获取ZonedDateTime 。 对于没有时间或时区的仅日期值,请使用LocalDate

首先,我们将“今天”作为示例日期值。 请注意,即使LocalDate不包含时区,也需要时区来确定当前日期。 这个日期在全球范围内并不是一样的,因为东方早些时候开始新的一天。

 LocalDate today = LocalDate.now ( ZoneId.of ( "America/Los_Angeles" ) ); 

调节器

ThreeTen-Extra项目使用其他或实验性function扩展了java.time。 这些function最终可能会或可能不会折叠到java.time中。 该项目提供了一个Temporals类,它提供了调整器的实现,包括一对nextWorkingDaypreviousWorkingDay 。 易于使用,如此处所示。

 // The 'Temporals' class is from the ThreeTen-Extra library, not built into Java. LocalDate previousWorkingDay = today.with ( Temporals.previousWorkingDay () ); LocalDate nextWorkingDay = today.with ( Temporals.nextWorkingDay () ); 

当跑

转储到控制台。 注意今天是星期五,所以前一个工作日是-1(昨天,星期四),下一个工作日是+3(星期一)。

 System.out.println ( "today: " + today + " | previousWorkingDay: " + previousWorkingDay + " | nextWorkingDay: " + nextWorkingDay ); 

今天:2016-01-22 | previousWorkingDay:2016-01-21 | nextWorkingDay:2016-01-25

星期六星期天

这对调节器每周六和周日都会跳过。 它对假期一无所知。 它也不知道工作周和周末的其他定义。 类文档建议如果要处理其他定义,编写自己的java.time.temporal.TemporalAdjuster很容易。

您可以按如下方式定义一个类:

 import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.Map; /** * * @author j.james */ public class MyCalendar { private static Map holidays = null; private static MyCalendar myCalendar = null; private static final int WEEKEND_1 = Calendar.SATURDAY; private static final int WEEKEND_2 = Calendar.SUNDAY; private MyCalendar() { holidays = new HashMap(); holidays.put("7,4", "Independence Day"); holidays.put("12,25", "Christmas"); //holidays.putAll(DBUtils.readAnyDynamicHolidaysFromDB()); } public static Date getPreviousWorkingDay(Date date) { Date previousWorkingDate = null; try { if (myCalendar == null) { myCalendar = new MyCalendar(); } if(date != null) { Calendar calInstance = Calendar.getInstance(); calInstance.setTime(date); int weekDay = 0; do { calInstance.add(Calendar.DATE, -1); weekDay = calInstance.get(Calendar.DAY_OF_WEEK); } while(weekDay == WEEKEND_1 || weekDay == WEEKEND_2 || holidays.get((calInstance.get(Calendar.MONTH) + 1) + "," + calInstance.get(Calendar.DATE)) != null); previousWorkingDate = calInstance.getTime(); } } catch (Exception e) { e.printStackTrace(); } return previousWorkingDate; } } 

你可以拨打电话

 public static void main(String[] args) { System.out.println(MyCalendar.getPreviousWorkingDay(new Date(2011-1900,6,5))); //July 5, 2011 which returns July 1 as the working day because July 4th 2011 is Monday }