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]

Reply via email to