Beispiel #1
0
 /**
  * Converts a day count into year, month and day components. Algorithm is derived from J R
  * Stockton (http://www.merlyn.demon.co.uk/daycount.htm).
  *
  * @param days day count
  * @return result array
  */
 private static long[] ymd(final BigDecimal days) {
   BigDecimal d = days;
   BigDecimal t =
       d.add(BD36525).multiply(BD4).divideToIntegralValue(BD146097).subtract(BigDecimal.ONE);
   BigDecimal y = BD100.multiply(t);
   d = d.subtract(BD36524.multiply(t).add(t.divideToIntegralValue(BD4)));
   t = d.add(BD366).multiply(BD4).divideToIntegralValue(BD1461).subtract(BigDecimal.ONE);
   y = y.add(t);
   d = d.subtract(BD365.multiply(t).add(t.divideToIntegralValue(BD4)));
   final BigDecimal m = BD5.multiply(d).add(BD2).divideToIntegralValue(BD153);
   d = d.subtract(BD153.multiply(m).add(BD2).divideToIntegralValue(BD5));
   long mm = m.longValue();
   if (mm > 9) {
     mm -= 12;
     y = y.add(BigDecimal.ONE);
   }
   return new long[] {y.subtract(BigDecimal.valueOf(ADD_NEG)).longValue(), mm + 2, d.longValue()};
 }
Beispiel #2
0
  /**
   * Adds the specified dayTime duration.
   *
   * @param add value to be added
   */
  private void add(final BigDecimal add) {
    // normalized modulo: sc % 60  vs.  (-sc + sc % 60 + 60 + sc) % 60
    final BigDecimal sc = sec().add(add);
    sec =
        sc.signum() >= 0
            ? sc.remainder(BD60)
            : sc.negate().add(sc.remainder(BD60)).add(BD60).add(sc).remainder(BD60);

    final long mn = Math.max(min(), 0) + div(sc.longValue(), 60);
    min = (byte) mod(mn, 60);
    final long ho = Math.max(hou, 0) + div(mn, 60);
    hou = (byte) mod(ho, 24);
    final long da = div(ho, 24);

    final long[] ymd = ymd(days().add(BigDecimal.valueOf(da)));
    yea = ymd[0];
    mon = (byte) ymd[1];
    day = (byte) ymd[2];
  }