如何确定特定时间周五和周日之间的日期

时间:2015-06-25 08:18:02

标签: java datetime jodatime simpledateformat range-checking

我正在尝试检查当前日期和时间是在星期五17:42到星期日17:42之间的Java。

目前我正在用非常糟糕的代码块做这件事。这是一个匆忙的解决方案。现在我正在重构,但我在joda等等找不到任何方法。

有什么想法吗? 感谢

private final Calendar currentDate = Calendar.getInstance();
private final int day = currentDate.get(Calendar.DAY_OF_WEEK);
private final int hour = currentDate.get(Calendar.HOUR_OF_DAY);
private final int minute = currentDate.get(Calendar.MINUTE);

if (day != 1 && day != 6 && day != 7) {
    if (combined != 0) {
        return badge == 1;
    } else {
        return badge == product;
    }
} else {
    if (day == 6 && hour > 16) {
        if (hour == 17 && minute < 43) {
            if (combined != 0) {
                return badge == 1;
            } else {
                return badge == product;
            }
        } else {
            return badge == 0;
        }
    } else if (day == 6 && hour < 17) {
        if (combined != 0) {
            return badge == 1;
        } else {
            return badge == product;
        }
    } else if (day == 1 && hour > 16) {
        if (hour == 17 && minute < 43) {
            return badge == 0;
        } else {
            if (combined != 0) {
                return badge == 1;
            } else {
                return badge == product;
            }
        }
    } else {
        return badge == 0;
    }
}

我在@MadProgrammer和@Meno Hochschild的帮助下使用了这样的解决方案

方法:

public static boolean isBetween(LocalDateTime check, LocalDateTime startTime, LocalDateTime endTime) {
 return ((check.equals(startTime) || check.isAfter(startTime)) && (check.equals(endTime) || check.isBefore(endTime))); }

用法:

static LocalDateTime now = LocalDateTime.now();
static LocalDateTime friday = now.with(DayOfWeek.FRIDAY).toLocalDate().atTime(17, 41);
static LocalDateTime sunday = friday.plusDays(2).plusMinutes(1);

if (!isBetween(now, friday, sunday)) { ... }

再次感谢您的努力。

3 个答案:

答案 0 :(得分:4)

DateCalendar的方法可以对Date / Calendarequalsbefore和{{的其他实例进行比较1}}

但是,我鼓励使用Java 8的新Time API

after

如果提供的public static boolean isBetween(LocalDateTime check, LocalDateTime startTime, LocalDateTime endTime) { return ((check.equals(startTime) || check.isAfter(startTime)) && (check.equals(endTime) || check.isBefore(endTime))); } 包含在指定范围内,则返回true

像...一样的东西。

LocalDateTime

哪个输出

LocalDateTime start = LocalDateTime.now();
start = start.withDayOfMonth(26).withHour(17).withMinute(42).withSecond(0).withNano(0);
LocalDateTime end = start.plusDays(2);

LocalDateTime check = LocalDateTime.now();

System.out.println(check + " is within range = " + isBetween(check, start, end));
check = start;
System.out.println(check + " is within range = " + isBetween(check, start, end));
check = end;
System.out.println(check + " is within range = " + isBetween(check, start, end));
check = start.plusDays(1);
System.out.println(check + " is within range = " + isBetween(check, start, end));
check = end.plusMinutes(1);
System.out.println(check + " is within range = " + isBetween(check, start, end));

Joda-Time有一个2015-06-25T18:31:32.969 is within range = false 2015-06-26T17:42 is within range = true 2015-06-28T17:42 is within range = true 2015-06-27T17:42 is within range = true 2015-06-28T17:43 is within range = false 课程,这使得它更加轻松

Interval

演示了here

一种不同的方法......

所以我在回家的路上,假设你所拥有的是你要检查的日期/时间,你如何确定这一天是否在你的范围内

Interval targetInterval = new Interval(targetStart, targetEnd);
System.out.println("Contains interval = " + interval.contains(targetInterval)

这样做会检查LocalDateTime now = LocalDateTime.now(); boolean isBetween = false; switch (now.getDayOfWeek()) { case FRIDAY: case SATURDAY: case SUNDAY: LocalDateTime lastFriday = getLastFriday(now); LocalDateTime nextSunday = getNextSunday(now); isBetween = isBetween(now, lastFriday, nextSunday); System.out.println(lastFriday + " - " + nextSunday + ": " + end); break; } 以查看它是否在所需范围内,如果是,则会从指定的范围内找到上一个dayOfWeek和下一个Friday日期并检查它是否介于它们之间(参见前面的例子)

SundaylastFriday只是从指定的日期/时间添加/减去nextSunday,直到达到所需的day,然后播种所需的时间限制

dayOfWeek

答案 1 :(得分:0)

使用Calendar,您可以知道给定日期DAY_OF_WEEK是什么,然后只需查看小时数:

Calendar c = Calendar.getInstance();
int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);
int hour = c.get(Calendar.HOUR_OF_DAY);
int minute = c.get(Calendar.MINUTE);

// in friday the hour must be greater than 17:42
if (dayOfWeek == 5 && ((hour > 17) || (hour == 17 && minute >= 42)) {
    // successss!!
}
// days from 1 to 7... saturday(6) all day
if (dayOfWeek == 6) {
    // successss!!
}
// sunday hour must be lower than 17:42
if (dayOfWeek == 7 && ((hour < 17) || (hour == 17 && minute <= 42)) {
    // successss!!
}

答案 2 :(得分:0)

使用旧Java 的更好解决方案如下所示:

// current timestamp
GregorianCalendar gcal = new GregorianCalendar();

// specify ISO-week (you are searching for friday until sunday in this order)
gcal.setMinimalDaysInFirstWeek(4);
gcal.setFirstDayOfWeek(Calendar.MONDAY);

// sunday at 17:43
GregorianCalendar sunday = (GregorianCalendar) gcal.clone();
sunday.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
sunday.set(Calendar.HOUR_OF_DAY, 17);
sunday.set(Calendar.MINUTE, 43);
sunday.set(Calendar.SECOND, 0);
sunday.set(Calendar.MILLISECOND, 0);

// friday at 17:42
GregorianCalendar friday = (GregorianCalendar) sunday.clone();
friday.add(Calendar.DATE, -2);
friday.add(Calendar.MINUTE, -1);

// logging for test purposes
SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
System.out.println(f.format(friday.getTime()));
System.out.println(f.format(gcal.getTime()));
System.out.println(f.format(sunday.getTime()));

// result (assumption: half-open-interval)
boolean withinTimeWindow = !gcal.before(friday) && gcal.before(sunday);

Java-8 提供了一种更短的方法(假设ISO-weekmodel):

LocalDateTime now = LocalDateTime.now();
LocalDateTime friday = now.with(DayOfWeek.FRIDAY).toLocalDate().atTime(17, 42);
LocalDateTime sunday = friday.plusDays(2).plusMinutes(1);
boolean withinTimeWindow = !now.isBefore(friday) && now.isBefore(sunday);

最后,您的等效评估可能如下所示:

  if (!withinTimeWindow) {
        if (combined != 0) {
            return badge == 1;
        } else {
            return badge == product;
        }
  } else {
        return badge == 0;
  }