我是使用java.calendar.api的新手。 我想指出使用java的某一天的前一个工作日。 但是当我使用calendar.api来操作日期时,条件会继续增加 因为我不得不考虑平常的周末和指向上个月,而且我还要考虑我所在地区的地区假期......
前言:说我必须考虑美国假期并指出前一天。有什么方法可以定义我自己的日历并使用它,以便日期操作能够感知所有这些常见的更改?
答案 0 :(得分:8)
虽然您应该考虑使用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)
添加到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;
}
答案 1 :(得分:3)
考虑将Joda Time与您所在地区的区域假日列表结合使用。
答案 2 :(得分:3)
LocalDate.now ( ZoneId.of ( "America/Montreal" ) )
.with ( org.threeten.extra.Temporals.previousWorkingDay () )
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项目扩展了具有附加或实验功能的java.time。这些功能可能会或可能不会最终折叠到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<星期六&amp;周日
这对调节器每周六和周日都会跳过。它对假期一无所知。它也不知道工作周和周末的其他定义。类文档建议如果要处理其他定义,编写自己的java.time.temporal.TemporalAdjuster很容易。
答案 3 :(得分:0)
您可以按如下方式定义一个类:
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<String, String> 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<String, String>();
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
}