如何计算从一个日期到另一个日期?

How to calculate from a date to another date?

我正在创建一个工作日日历,用于计算工作日结束的日期。 我有一个设置每日工作时间的代码,例如 8:00-16:00 (workDayStartStop)。 给定开始日期和以天为单位的增量时,代码应打印出哪个日期。 工作日的增量可以是例如 1.5f(这意味着 8 + 4 小时工作日)或 1.25f(8 + 2 工作小时)。

##问题:

  1. 我的代码只能正确打印日期和时间,但它也需要计算分钟数。

  2. 如果在递增的天数中提供负值,我的代码也需要向后计算。

public void setWorkdayStartAndStop(Calendar start, 
      Calendar stop) {
      ZonedDateTime startZdt = ((GregorianCalendar) 
  start).toZonedDateTime();

    ZonedDateTime endZdt = ((GregorianCalendar) 
  stop).toZonedDateTime();

    long wholeDays = ChronoUnit.DAYS.between(startZdt, endZdt);

    startZdt = startZdt.plusDays(wholeDays);

    Duration workDay = Duration.between(startZdt, endZdt);

    this.workdayStartAndStop = (float) workDay.toMinutes() / 
    (float) Duration.ofHours(1).toMinutes();
  }

  public LocalDateTime getWorkdayIncrement(LocalDateTime 
    startDate, float incrementInWorkdays) {
    Holidays holidays = new Holidays();
    CalendarController cc = new CalendarController();
    holidays.setHolidayIfIsSetToRecurring();

    int days = (int) Math.abs(incrementInWorkdays);
    float remaining = incrementInWorkdays - days;
    float fHours = remaining * 24f;
    int hours = (int) fHours;

    remaining = fHours - hours;
    float fMinutes = remaining * 60f;
    int minutes = (int) fMinutes;

    LocalDateTime mDateTime = null;

    for (int i = 0; i <= days; i++) {
        mDateTime = 
    startDate.plusDays(i).plusHours(hours).plusMinutes(minutes);

        LocalDate toLocalDate = mDateTime.toLocalDate();

        //if the incremented day is a holiday, skip to nextday
        if (cc.isHoliday(toLocalDate)) {
            days += 1;
        }
    }
    return mDateTime;
}
}

 public static void main(String[] args) {
    WorkdayCalendar workdayCalendar = new WorkdayCalendar();

    workdayCalendar.setWorkdayStartAndStop(
            LocalDateTime.of(2020, 1, 1, 8, 0),
            LocalDateTime.of(2020, 1, 1, 16, 0));

    workdayCalendar.setRecurringHoliday(
            MonthDay.of(5, 17));

    workdayCalendar.setHoliday(LocalDate.of(2020, 5, 27));

    LocalDateTime start = LocalDateTime.of(2020, 5, 24, 8, 5);

    String datePattern = "dd-MM-yyyy HH:mm";
    DateTimeFormatter europeanDateFormatter = 
 DateTimeFormatter.ofPattern(datePattern);

    float increment = 1.5f;

    System.out.println(
            europeanDateFormatter.format(start) +
                    " with the addition of " +
                    increment +
                    " working days is " +
                    europeanDateFormatter.format(workdayCalendar.getWorkdayIncrement(start, increment)));
}

输出为:

24-05-2020 08:05 加上 1.5 个工作日是 26-05-2020 20:05

从 24 日早上 8 点开始,应该在 25 日凌晨 12 点结束 (8h + 4h)。 1个工作日只有8-16,那么应该跳到第二天。如果 startDate 设置为 fra 08:00 并且 wokringhours 设置为每天 8 小时,它应该只给出 8-16 之间的结果。

您使用的是过时且损坏的 date/time API,它们令人困惑且容易出错。使用智能且直观的 modern date/time API

import java.time.LocalDateTime;
import java.time.Month;

public class Main {
    public static void main(String[] args) {
        LocalDateTime ldt = LocalDateTime.of(2020, Month.JUNE, 18, 21, 50, 5);
        System.out.println(ldt);

        // After 2.75 days
        System.out.println(getWorkdayIncrement(ldt, 2.75f));
    }

    public static LocalDateTime getWorkdayIncrement(LocalDateTime startDate, float incrementInWorkdays) {
        int days = (int) incrementInWorkdays;

        float remaining = incrementInWorkdays - days;
        float fhours = remaining * 24f;
        int hours = (int) fhours;

        remaining = fhours - hours;
        float fminutes = remaining * 60f;
        int minutes = (int) fminutes;

        return startDate.plusDays(days).plusHours(hours).plusMinutes(minutes);
    }
}

输出:

2020-06-18T21:50:05
2020-06-21T15:50:05

[更新]

下面给出了如何从 MonthDay 中得到 LocalDate:

import java.time.LocalDate;
import java.time.Month;
import java.time.MonthDay;

public class Main {
    public static void main(String[] args) {
        // Month-day of June, 20
        MonthDay monthDay = MonthDay.of(Month.JUNE, 20);
        LocalDate date = monthDay.atYear(2020);
        System.out.println(date);

        // Month-day now
        monthDay = MonthDay.now();
        date = monthDay.atYear(2020);
        System.out.println(date);
    }
}

输出:

2020-06-20
2020-06-20