DateUtils' new addWeekdays feature
----------------------------------
Key: LANG-347
URL: https://issues.apache.org/jira/browse/LANG-347
Project: Commons Lang
Issue Type: New Feature
Affects Versions: 2.3
Reporter: Vasily Ivanov
Fix For: 2.3.1, 3.0
New method to add signed number of weekdays (skipping weekends):
/**
* Adds a number of weekdays (skipping weekends) to a date returning a new
Date object.
* The original date object is unchanged.
* <p>
* If the original Date itself is on a weekend, calculation will be started
from the
* next Monday morning (0:00:00.000) if an amount is positive or from the
last Friday night
* (23:59:59.999) otherwise.
*
* @param date the date, not null
* @param amount the amount to add, may be negative
* @return the new Date object with the amount added
*/
public static Date addWeekdays(Date date,
int amount)
{
if (date == null) {
throw new IllegalArgumentException("The date must not be null");
}
Calendar c = Calendar.getInstance();
c.setTime(date);
if (amount != 0) {
if (isWeekend(c)) {
// see comments above
final boolean isSat = getDayOfWeek(c) == Calendar.SATURDAY;
int numToJump = 0;
if (amount > 0) {
// this will jump date to the closest Monday
numToJump = isSat ? 2 : 1;
} else {
// this will jump date to the closest Saturday
numToJump = isSat ? 0 : -1;
}
c.add(Calendar.DAY_OF_MONTH, numToJump);
// this will jump to the start of the day (Monday or Saturday)
modify(c, Calendar.DAY_OF_MONTH, false);
if (amount < 0) {
// this will go back to the end of prev Friday
c.add(Calendar.MILLISECOND, -1);
}
}
int count = 0;
final int absAmount = Math.abs(amount);
final int offset = amount > 0 ? 1 : -1;
while (count < absAmount) {
c.add(Calendar.DAY_OF_MONTH, offset);
if (!isWeekend(c)) {
count++;
}
}
}
return c.getTime();
}
public static int getDayOfWeek(Calendar c)
{
return c.get(Calendar.DAY_OF_WEEK);
}
public static boolean isWeekend(Calendar c)
{
final int dayOfWeek = getDayOfWeek(c);
return dayOfWeek == Calendar.SATURDAY || dayOfWeek == Calendar.SUNDAY;
}
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]