使用java指向上一个工作日

时间:2011-05-06 07:05:24

标签: java

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

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

有什么方法可以定义我自己的日历并使用它,以便日期操作能够感知所有这些常见的更改?

4 个答案:

答案 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)

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项目扩展了具有附加或实验功能的java.time。这些功能可能会或可能不会最终折叠到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

<星期六&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
}