You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by "Vasily Ivanov (JIRA)" <ji...@apache.org> on 2007/07/09 03:22:04 UTC
[jira] Created: (LANG-347) DateUtils' new addWeekdays feature
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: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org
[jira] Updated: (LANG-347) DateUtils' new addWeekdays feature
Posted by "Henri Yandell (JIRA)" <ji...@apache.org>.
[ https://issues.apache.org/jira/browse/LANG-347?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Henri Yandell updated LANG-347:
-------------------------------
Fix Version/s: (was: 2.3.1)
> 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: 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: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org