使用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
类,它提供了调整器的实现,包括一对nextWorkingDay
和previousWorkingDay
。 易于使用,如此处所示。
// 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 }