java日历-获取一周的最后5天(无周末)

java日历-获取一周的最后5天(无周末),java,calendar,Java,Calendar,我正在处理一些问题 我需要从数据库中获取一些数据 1) 从最后5天中获取5条记录(每天一条记录),但这些天必须是一周中的几天(现在是周末) 2) 从当月获取20条记录(当前或过去,每天一条记录) 我正在努力使用Java日历,但仍然不知道如何获取日期 有人能帮我吗 只是一个开始 Calendar cal = Calendar.getInstance();//initilized with current date & time Date date = cal.getTime();//ret

我正在处理一些问题

我需要从数据库中获取一些数据

1) 从最后5天中获取5条记录(每天一条记录),但这些天必须是一周中的几天(现在是周末)

2) 从当月获取20条记录(当前或过去,每天一条记录)

我正在努力使用Java日历,但仍然不知道如何获取日期

有人能帮我吗

只是一个开始

Calendar cal = Calendar.getInstance();//initilized with current date & time
Date date = cal.getTime();//returned the current date & time that cal holds
boolean isMonday = Calendar.MONDAY == cal.get(Calendar.DAY_OF_WEEK);//it will return an integer 

只是一个开始

Calendar cal = Calendar.getInstance();//initilized with current date & time
Date date = cal.getTime();//returned the current date & time that cal holds
boolean isMonday = Calendar.MONDAY == cal.get(Calendar.DAY_OF_WEEK);//it will return an integer 
应该可以:

private Calendar workingDaysBack(final Calendar from, final int count) {
    for (int daysBack = 0; daysBack < count; ++daysBack) {
        do {
            from.add(Calendar.DAY_OF_YEAR, -1);
        } while(isWeekend(from));
    }
    return from;
}

private boolean isWeekend(Calendar cal) {
    return cal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY ||
           cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY;
}
private Calendar workingDaysBack(最终日历开始,最终整数计数){
对于(int daysBack=0;daysBack
应该可以:

private Calendar workingDaysBack(final Calendar from, final int count) {
    for (int daysBack = 0; daysBack < count; ++daysBack) {
        do {
            from.add(Calendar.DAY_OF_YEAR, -1);
        } while(isWeekend(from));
    }
    return from;
}

private boolean isWeekend(Calendar cal) {
    return cal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY ||
           cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY;
}
private Calendar workingDaysBack(最终日历开始,最终整数计数){
对于(int daysBack=0;daysBack<代码> > P>你可以通过在你想考虑的每一天中调整星期的参数来完成第一部分。取决于您希望在几周内跑步时的行为-应该是当前一周,还是最后一个完整的一周?这里我假设本周

Calendar cal = Calendar.getInstance();

List<Date> last5Days = new LinkedList<Date>();
List<Integer> weekDays = Arrays.asList(Calendar.MONDAY,
        Calendar.TUESDAY, Calendar.WEDNESDAY, Calendar.THURSDAY,
        Calendar.FRIDAY);
for (int weekDay : weekDays) {
    cal.set(Calendar.DAY_OF_WEEK, weekDay);
    last5Days.add(cal.getTime());
}
System.out.println(last5Days);
Calendar cal=Calendar.getInstance();
List last5Days=新建LinkedList();
List weekDays=Arrays.asList(Calendar.MONDAY,
日历。星期二,日历。星期三,日历。星期四,
日历(星期五);
对于(int工作日:工作日){
校准设置(日历日/周/日、工作日);
last5Days.add(cal.getTime());
}
系统输出打印(最近5天);
自当月起20周。取决于您希望在几周内而不是跨越月份边界的行为。在这里,我已经前进到第一个星期一,然后从那里继续

List<Date> last20Days = new LinkedList<Date>();
// find first Monday in the month
for (int i = 1; i <= 31; i++) {
    cal.set(Calendar.DAY_OF_MONTH, i);
    if (cal.get(Calendar.DAY_OF_WEEK) == weekDays.get(0)) {
        break;
    }
}
for (int i = 1; i <= 31; i++) {
    if (last20Days.size() == 20) {
        break;
    }
    if (weekDays.contains(cal.get(Calendar.DAY_OF_WEEK))) {
        last20Days.add(cal.getTime());
    }
    cal.add(Calendar.DAY_OF_MONTH, 1);
}
System.out.println(last20Days);
List last20Days=newlinkedlist();
//找到本月的第一个星期一

对于(int i=1;i),你可以通过调整你想考虑的每一天的周数来做第一部分。取决于你想在周内运行的行为应该是当前的一周还是最后一周?这里我假设了当前的一周……/P>
Calendar cal = Calendar.getInstance();

List<Date> last5Days = new LinkedList<Date>();
List<Integer> weekDays = Arrays.asList(Calendar.MONDAY,
        Calendar.TUESDAY, Calendar.WEDNESDAY, Calendar.THURSDAY,
        Calendar.FRIDAY);
for (int weekDay : weekDays) {
    cal.set(Calendar.DAY_OF_WEEK, weekDay);
    last5Days.add(cal.getTime());
}
System.out.println(last5Days);
Calendar cal=Calendar.getInstance();
List last5Days=新建LinkedList();
List weekDays=Arrays.asList(Calendar.MONDAY,
日历。星期二,日历。星期三,日历。星期四,
日历(星期五);
对于(int工作日:工作日){
校准设置(日历日/周/日、工作日);
last5Days.add(cal.getTime());
}
系统输出打印(最近5天);
从当前月份开始的20个星期天。这取决于您希望在几周内有什么行为,而不是跨越月份边界。这里我将前进到第一个星期一,然后从那里添加

List<Date> last20Days = new LinkedList<Date>();
// find first Monday in the month
for (int i = 1; i <= 31; i++) {
    cal.set(Calendar.DAY_OF_MONTH, i);
    if (cal.get(Calendar.DAY_OF_WEEK) == weekDays.get(0)) {
        break;
    }
}
for (int i = 1; i <= 31; i++) {
    if (last20Days.size() == 20) {
        break;
    }
    if (weekDays.contains(cal.get(Calendar.DAY_OF_WEEK))) {
        last20Days.add(cal.getTime());
    }
    cal.add(Calendar.DAY_OF_MONTH, 1);
}
System.out.println(last20Days);
List last20Days=newlinkedlist();
//找到本月的第一个星期一
太长了,读不下去了(int i=1;
使用java.time
其他答案使用了麻烦的旧日期时间类,如
Calendar
,而不是现在的遗留类,被java.time类取代

要获得最后五天,你首先需要获得“今天”

LocalDate
该类表示一个仅限日期的值,不包含一天中的时间和时区

时区对于确定日期至关重要。对于任何给定的时刻,全球各地的日期都因区域而异。例如,年午夜后几分钟是新的一天,而年仍然是“昨天”

请以
大陆/地区
的格式指定一个,例如,或
太平洋/奥克兰
。切勿使用3-4个字母的缩写,例如
EST
IST
,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)

DayOfWeek
要获取以前的日期,可以调用
minusDays
以增量方式移动过去的日期

LocalDate yesterday = today.minusDays( 1 );
LocalDate dayBeforeYesterday = yesterday.minusDays( 1 );
您可以使用
DayOfWeek
enum测试每个
LocalDate
对象的星期几。该类预定义了七个对象,一周中的每一天一个。请注意,这些对象是真实对象,而不仅仅是字符串。这里根本不需要使用字符串

Boolean isSaturday = myLocalDate.getDayOfWeek().equals( DayOfWeek.SATURDAY );
Boolean isSunday = myLocalDate.getDayOfWeek().equals( DayOfWeek.SUNDAY );
EnumSet
进行比较的一种更巧妙、更灵活的方法是使用,这是一种针对枚举优化的实现,执行速度非常快,占用的内存非常少

EnumSet<DayOfWeek> weekend = EnumSet.of( DayOfWeek.SATURDAY , DayOfWeek.SUNDAY );
三十个额外的
TemporalAdjuster
previousWorkingDay()
该项目使用附加功能扩展了java.time类

此调整器硬编码为跳过星期六和星期日。如果希望考虑星期几的其他值,可以编写自己的
TemporalAdjuster
实现

java.time类使用不可变对象。因此,我们不改变对象上的值(“mutate”),而是基于原始值生成一个新的对象。因此,在这里我们调用,传递一个
TemporalAdjuster
,并生成一个新的
LocalDate
,该对象在跳过周六/周日时表示先前的日期

LocalDate previousWorkingDay = 
    myLocalDate.with( 
        org.threeten.extra.Temporals.previousWorkingDay() 
    ) 
;
完整示例 让我们把这些都放在一起

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

Integer countDaysPrior = 5;
List<LocalDate> priorWeekdays = new ArrayList<> ( countDaysPrior ); // Set initial capacity to number of days to be collected.
LocalDate localDate = today; // Initialize to today. Exclusive, we want only prior days.
for ( int i = 1 ; i <= countDaysPrior ; i ++ ) {
    localDate = localDate.with ( org.threeten.extra.Temporals.previousWorkingDay () );  // Decrement each day into the past, skipping over Saturday/Sunday.
    priorWeekdays.add ( localDate );
}

System.out.println ( "Weekdays prior to " + today + " are: " + priorWeekdays );
ZoneId z=ZoneId.of(“美国/蒙特利尔”);
LocalDate today=LocalDate.now(z);
整数countDaysPrior=5;
List prior weekdays=new ArrayList(countDaysPrior);//将初始容量设置为要收集的天数。
LocalDate LocalDate=today;//初始化为today.Exclusive,我们只需要前几天。
太长了,读不下去了(int i=1;
使用java.time
其他答案使用了麻烦的旧日期时间类,例如
Calendar
,而不是现在的遗留类,被java.time c取代