如何在不增加周末的情况下增加营业时间JAVA

如何在不增加周末的情况下增加营业时间JAVA,java,android,Java,Android,我想增加一定数量的时间,忽略周末 比如说, (星期五18:00)+48=(星期四18:00)(忽略星期六和星期日) 由于公司24小时工作,营业时间为24小时。但我仍然不知道如何只在工作日增加工作时间 函数可以类似于: public Date getTaskEndTime(Calendar startDate, int hours){ // calculate the end time by adding the hours ignoring the weekends } 基本上,您需要做

我想增加一定数量的时间,忽略周末

比如说,

(星期五18:00)+48=(星期四18:00)(忽略星期六和星期日)

由于公司24小时工作,营业时间为24小时。但我仍然不知道如何只在工作日增加工作时间

函数可以类似于:

public Date getTaskEndTime(Calendar startDate, int hours){
   // calculate the end time by adding the hours ignoring the weekends
}

基本上,您需要做的是首先计算一周剩余的小时数(这是当前时间与24小时的差值:00@Fri). 如果小时数小于此数,只需添加

否则,从小时数中减去该值,然后如果余数超过120小时(一周),则取整数商并跳过该数周。最后,将余数添加到00:00@Mon那周


在您的示例中,从开始到24之间:00@Fri6小时,小于48小时,所以你从中减去6小时,得到42小时。现在42小时小于120小时,因此您不会跳过几周,然后将42小时添加到00:00@Mon到18岁时:00@Tue.

基本上,您需要做的是首先计算一周剩余的小时数(这是当前时间和24小时之间的差值:00@Fri). 如果小时数小于此数,只需添加

否则,从小时数中减去该值,然后如果余数超过120小时(一周),则取整数商并跳过该数周。最后,将余数添加到00:00@Mon那周


在您的示例中,从开始到24之间:00@Fri6小时,小于48小时,所以你从中减去6小时,得到42小时。现在42小时小于120小时,因此您不会跳过几周,然后将42小时添加到00:00@Mon到18岁时:00@Tue.

您需要以自定义方式处理它:

  public Date getTaskEndTime(Calendar startDate, int hours) {
        Calendar endTime = Calendar.getInstance();
        endTime.setTime(startDate.getTime());
        endTime.add(Calendar.HOUR, hours); // add 2 for saturday and sunday
        int dayOfWeek = endTime.get(Calendar.DAY_OF_WEEK);
        if (dayOfWeek == Calendar.SATURDAY) {
            endTime.add(Calendar.DATE, 2); // add 2 for saturday and sunday
        } else if (dayOfWeek == Calendar.SATURDAY) {
            endTime.add(Calendar.DATE, 1); // add 1 for sunday
        }
        return endTime.getTime();
    }

您需要以自定义方式处理它:

  public Date getTaskEndTime(Calendar startDate, int hours) {
        Calendar endTime = Calendar.getInstance();
        endTime.setTime(startDate.getTime());
        endTime.add(Calendar.HOUR, hours); // add 2 for saturday and sunday
        int dayOfWeek = endTime.get(Calendar.DAY_OF_WEEK);
        if (dayOfWeek == Calendar.SATURDAY) {
            endTime.add(Calendar.DATE, 2); // add 2 for saturday and sunday
        } else if (dayOfWeek == Calendar.SATURDAY) {
            endTime.add(Calendar.DATE, 1); // add 1 for sunday
        }
        return endTime.getTime();
    }

以不大于24小时的步长添加小时。并在每一步后检查你是否在周六或周日结束。在每种情况下,再增加24小时。那应该是你想要的

public Date getTaskEndTime(Calendar startDate, int hours){
    while (hours > 0){
        int step = 0;
        if(hours > 24) step = 24;
        else step = hours;          
        hours -= step;          
        startDate.add(Calendar.HOUR_OF_DAY, step);          
        int dayOfWeek = startDate.get(Calendar.DAY_OF_WEEK);
        if(dayOfWeek == Calendar.SATURDAY) hours += 24;
        if(dayOfWeek == Calendar.SUNDAY) hours += 24;
    }
    return startDate.getTime();
}

以不大于24小时的步长添加小时。并在每一步后检查你是否在周六或周日结束。在每种情况下,再增加24小时。那应该是你想要的

public Date getTaskEndTime(Calendar startDate, int hours){
    while (hours > 0){
        int step = 0;
        if(hours > 24) step = 24;
        else step = hours;          
        hours -= step;          
        startDate.add(Calendar.HOUR_OF_DAY, step);          
        int dayOfWeek = startDate.get(Calendar.DAY_OF_WEEK);
        if(dayOfWeek == Calendar.SATURDAY) hours += 24;
        if(dayOfWeek == Calendar.SUNDAY) hours += 24;
    }
    return startDate.getTime();
}

我强烈建议使用Java8的
JodaTime
(或
DateTime
),因为旧的日期/日历API非常无用

public DateTime getEndtime(final DateTime startdate, final int hours) {
    final DateTime endOfWeek = endOfWeek(startdate);

    final Duration restOfWeek = new Duration(startdate, endOfWeek);

    final Duration hoursDuration = toDuration(hours);
    if (restOfWeek.isLongerThan(hoursDuration)) {
        return startdate.plus(hoursDuration);
    } else {
        final Duration durationForNextWeek = hoursDuration.minus(restOfWeek);
        return startOfWeek(startdate).plus(durationForNextWeek);
    }
}

//Converts number of hours as int to Duration
private Duration toDuration(final int hours) {
    return new Duration(hours * 60 * 60 * 1000);
}

//Returns coming friday, 1 millisecond to midnight
private DateTime endOfWeek(final DateTime dateTime) {
    DateTime copy = dateTime;
    while (copy.getDayOfWeek() != 6) {
        copy = copy.plusDays(1);
    }

    return copy.toDateMidnight().toDateTime().minusMillis(1);
}

//Returns the following monday at midnight
//If dateTime is on a monday, the next monday will be chosen
private DateTime startOfWeek(final DateTime dateTime) {
    DateTime copy = dateTime.plusDays(1);
    while (copy.getDayOfWeek() != 1) {
        copy = copy.plusDays(1);
    }

    return copy.toDateMidnight().toDateTime();
}
守则解释:

  • 检查是否可以在不跨越周末的情况下添加小时数
  • 如果没有,只需将小时数添加到开始日期
  • 如果是,请查找要转移到下周的持续时间,并将其添加到周初

此代码不支持长达数周的任务,但您可以修改它以支持此任务。。可能是一些边缘情况没有得到很好的处理,我将留给您进行彻底的测试。

我强烈建议使用
JodaTime
(或者
DateTime
,Java8),因为旧的日期/日历API非常无用

public DateTime getEndtime(final DateTime startdate, final int hours) {
    final DateTime endOfWeek = endOfWeek(startdate);

    final Duration restOfWeek = new Duration(startdate, endOfWeek);

    final Duration hoursDuration = toDuration(hours);
    if (restOfWeek.isLongerThan(hoursDuration)) {
        return startdate.plus(hoursDuration);
    } else {
        final Duration durationForNextWeek = hoursDuration.minus(restOfWeek);
        return startOfWeek(startdate).plus(durationForNextWeek);
    }
}

//Converts number of hours as int to Duration
private Duration toDuration(final int hours) {
    return new Duration(hours * 60 * 60 * 1000);
}

//Returns coming friday, 1 millisecond to midnight
private DateTime endOfWeek(final DateTime dateTime) {
    DateTime copy = dateTime;
    while (copy.getDayOfWeek() != 6) {
        copy = copy.plusDays(1);
    }

    return copy.toDateMidnight().toDateTime().minusMillis(1);
}

//Returns the following monday at midnight
//If dateTime is on a monday, the next monday will be chosen
private DateTime startOfWeek(final DateTime dateTime) {
    DateTime copy = dateTime.plusDays(1);
    while (copy.getDayOfWeek() != 1) {
        copy = copy.plusDays(1);
    }

    return copy.toDateMidnight().toDateTime();
}
守则解释:

  • 检查是否可以在不跨越周末的情况下添加小时数
  • 如果没有,只需将小时数添加到开始日期
  • 如果是,请查找要转移到下周的持续时间,并将其添加到周初

此代码不支持长达数周的任务,但您可以修改它以支持此任务。。可能有一些边缘情况没有得到很好的处理,我将留给您进行彻底的测试。

请参考下面的代码,看看这是否对您有帮助

public static Date getTaskEndTime(Date startDate, int hours) {
    // calculate the end time by adding the hours ignoring the weekends
    Calendar endCal = Calendar.getInstance();
    endCal.setTime(startDate);

    for (int i = 0; i < hours; hours = hours - 8) {
        if (!(endCal.get(Calendar.DAY_OF_WEEK) == 1 || endCal.get(Calendar.DAY_OF_WEEK) == 7)) {
            endCal.add(Calendar.DAY_OF_MONTH, 1);
        } else {
            endCal.add(Calendar.DAY_OF_MONTH, 1);
            hours = hours + 8;
        }
    }
    return endCal.getTime();
}
public static Date getTaskEndTime(Date startDate,int hours){
//通过添加忽略周末的小时数来计算结束时间
Calendar endCal=Calendar.getInstance();
端校准设定时间(起始日期);
对于(int i=0;i
请参考下面的代码,看看这是否对您有帮助

public static Date getTaskEndTime(Date startDate, int hours) {
    // calculate the end time by adding the hours ignoring the weekends
    Calendar endCal = Calendar.getInstance();
    endCal.setTime(startDate);

    for (int i = 0; i < hours; hours = hours - 8) {
        if (!(endCal.get(Calendar.DAY_OF_WEEK) == 1 || endCal.get(Calendar.DAY_OF_WEEK) == 7)) {
            endCal.add(Calendar.DAY_OF_MONTH, 1);
        } else {
            endCal.add(Calendar.DAY_OF_MONTH, 1);
            hours = hours + 8;
        }
    }
    return endCal.getTime();
}
public static Date getTaskEndTime(Date startDate,int hours){
//通过添加忽略周末的小时数来计算结束时间
Calendar endCal=Calendar.getInstance();
端校准设定时间(起始日期);
对于(int i=0;i
避免使用旧的日期时间类 您使用的是旧的日期时间类,这些类被证明设计得很糟糕,令人困惑,而且很麻烦。避开它们

java.time 使用Java 8及更高版本中内置的框架。看见对于Java6和Java7,请使用项目。对于Android,该后端端口的适应

下面是一些示例代码,可以帮助您继续。我只是即兴创作的,所以它可能并不强大。此代码似乎适用于您的一个示例用法:

(星期五18:00)+48=(星期四18:00)(忽略星期六和星期日)

我对这段代码做了一些概括。任何时间跨度(内部表示为总秒数加上几分之一秒(以纳秒为单位))都需要a,而不是小时数。您会注意到
toString
方法的输出使用标准ISO 8601表示法,例如
PT48H
表示48小时的示例量

假设您想要时间线上的真实时刻,我们需要使用时区来解释异常情况,例如夏令时(DST)。为此,我们需要从一个将UTC()时间轴上的某个时刻与时区()相结合的时间轴开始

我们也有pas
ZonedDateTime zdtLater = this.addDurationSkippingDaysOfWeek ( zdt , duration , daysOfWeek );
System.out.println ( "zdt: " + zdt + " plus duration: " + duration + " while skipping daysOfWeek: " + daysOfWeek + " is zdtLater: " + zdtLater );
public static Date addBusinessHours(Calendar startDate, int hours, int workingHourStart, int workingHourEnd){
    System.out.println("Entering: Date Time " + startDate.getTime() + " | Remaining Hours: "+ hours + " | Working hours ("+workingHourStart+"-"+workingHourEnd+")");

    if(hours == 0){
        return startDate.getTime();
    }
    int hourOfDay = startDate.get(Calendar.HOUR_OF_DAY);
    if(startDate.get(Calendar.MINUTE) > 0){
        hourOfDay = hourOfDay +1;
    }

    int dayOfWeek = startDate.get(Calendar.DAY_OF_WEEK);

    if(dayOfWeek == Calendar.SATURDAY){
        startDate.add(Calendar.DATE, 2);
        startDate.set(Calendar.HOUR_OF_DAY, workingHourStart);
        startDate.set(Calendar.MINUTE, 0);
        startDate.set(Calendar.SECOND, 0);
        addBusinessHours(startDate, hours, workingHourStart, workingHourEnd);
    }
    if(dayOfWeek == Calendar.SUNDAY){
        startDate.add(Calendar.DATE, 1);
        startDate.set(Calendar.HOUR_OF_DAY, workingHourStart);
        startDate.set(Calendar.MINUTE, 0);
        startDate.set(Calendar.SECOND, 0);
        addBusinessHours(startDate, hours, workingHourStart, workingHourEnd);
    }

    if(dayOfWeek != Calendar.SATURDAY && dayOfWeek != Calendar.SUNDAY){
        if(hourOfDay < workingHourStart){
            startDate.set(Calendar.HOUR_OF_DAY, workingHourStart);
            startDate.set(Calendar.MINUTE, 0);
            startDate.set(Calendar.SECOND, 0);
            hourOfDay = startDate.get(Calendar.HOUR_OF_DAY);
            dayOfWeek = startDate.get(Calendar.DAY_OF_WEEK);
            addBusinessHours(startDate, hours, workingHourStart, workingHourEnd);
        }
        else if(hourOfDay >= workingHourEnd){

            startDate.add(Calendar.DATE, 1);
            startDate.set(Calendar.HOUR_OF_DAY, workingHourStart);
            startDate.set(Calendar.MINUTE, 0);
            startDate.set(Calendar.SECOND, 0);
            hourOfDay = startDate.get(Calendar.HOUR_OF_DAY);
            dayOfWeek = startDate.get(Calendar.DAY_OF_WEEK);
            addBusinessHours(startDate, hours, workingHourStart, workingHourEnd);
        }

        else if(hourOfDay >= workingHourStart && hourOfDay < workingHourEnd){
            if(hours+hourOfDay <= workingHourEnd){
                startDate.add(Calendar.HOUR_OF_DAY, hours);
                return startDate.getTime();
            }else{
                //System.out.println("¤¤" + startDate.getTime() );
                startDate.add(Calendar.DATE, 1);
                //System.out.println("¤¤" + startDate.getTime() );
                startDate.set(Calendar.HOUR_OF_DAY, workingHourStart);
                startDate.set(Calendar.MINUTE, 0);
                startDate.set(Calendar.SECOND, 0);
                //System.out.println("¤¤" + startDate.getTime() );

                System.out.println("##"+hours+ "##"+ workingHourEnd + "##" + hourOfDay);
                int remaining_hours = hours - (workingHourEnd - hourOfDay);
                addBusinessHours(startDate, remaining_hours, workingHourStart, workingHourEnd);
            }
        }
    }

    return startDate.getTime();
}