如何在不增加周末的情况下增加营业时间JAVA
我想增加一定数量的时间,忽略周末 比如说, (星期五18:00)+48=(星期四18:00)(忽略星期六和星期日) 由于公司24小时工作,营业时间为24小时。但我仍然不知道如何只在工作日增加工作时间 函数可以类似于:如何在不增加周末的情况下增加营业时间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 } 基本上,您需要做
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();
}