//# 0 errors, 53 messages
//#
/*
    //#relativedate.java:1:1: class: net.sourceforge.pebble.util.RelativeDate
    //#relativedate.java:1:1: method: net.sourceforge.pebble.util.RelativeDate.net.sourceforge.pebble.util.RelativeDate__static_init
 * Copyright (c) 2003-2006, Simon Brown
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *   - Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *
 *   - Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in
 *     the documentation and/or other materials provided with the
 *     distribution.
 *
 *   - Neither the name of Pebble nor the names of its contributors may
 *     be used to endorse or promote products derived from this software
 *     without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */
package net.sourceforge.pebble.util;

/**
 * Represents a relative date (the time since something happened).
 * 
 * @author Simon Brown
 */
public class RelativeDate {

  private static final long SECOND = 1000;
  private static final long MINUTE = SECOND * 60;
  private static final long HOUR = MINUTE * 60;
  private static final long DAY = HOUR * 24;

  /** the number of milliseconds */
  private long time;

  /**
   * Creates a new instance with the specified time.
   *
   * @param time    a number of milliseconds
   */
  public RelativeDate(long time) {
    //#relativedate.java:54: method: void net.sourceforge.pebble.util.RelativeDate.net.sourceforge.pebble.util.RelativeDate(long)
    //#input(void net.sourceforge.pebble.util.RelativeDate(long)): this
    //#input(void net.sourceforge.pebble.util.RelativeDate(long)): time
    //#output(void net.sourceforge.pebble.util.RelativeDate(long)): this.time
    //#post(void net.sourceforge.pebble.util.RelativeDate(long)): this.time == time
    //#post(void net.sourceforge.pebble.util.RelativeDate(long)): init'ed(this.time)
    this.time = time;
  }
    //#relativedate.java:56: end of method: void net.sourceforge.pebble.util.RelativeDate.net.sourceforge.pebble.util.RelativeDate(long)

  public long getDays() {
    return time / DAY;
    //#relativedate.java:59: method: long net.sourceforge.pebble.util.RelativeDate.getDays()
    //#input(long getDays()): this
    //#input(long getDays()): this.time
    //#output(long getDays()): return_value
    //#pre[2] (long getDays()): init'ed(this.time)
    //#post(long getDays()): return_value == this.time/86_400_000
    //#post(long getDays()): return_value in -106_751_991_167..213_503_982_334
    //#relativedate.java:59: end of method: long net.sourceforge.pebble.util.RelativeDate.getDays()
  }

  public long getHours() {
    return (time % DAY) / HOUR;
    //#relativedate.java:63: method: long net.sourceforge.pebble.util.RelativeDate.getHours()
    //#input(long getHours()): this
    //#input(long getHours()): this.time
    //#output(long getHours()): return_value
    //#pre[3] (long getHours()): init'ed(this.time)
    //#post(long getHours()): return_value == (this.time%86_400_000)/3_600_000
    //#post(long getHours()): return_value in -23..23
    //#relativedate.java:63: end of method: long net.sourceforge.pebble.util.RelativeDate.getHours()
  }

  public long getMinutes() {
    return ((time % DAY) % HOUR) / MINUTE;
    //#relativedate.java:67: method: long net.sourceforge.pebble.util.RelativeDate.getMinutes()
    //#input(long getMinutes()): this
    //#input(long getMinutes()): this.time
    //#output(long getMinutes()): return_value
    //#pre[4] (long getMinutes()): init'ed(this.time)
    //#post(long getMinutes()): return_value == ((this.time%86_400_000)%3_600_000)/60_000
    //#post(long getMinutes()): return_value in -59..59
    //#relativedate.java:67: end of method: long net.sourceforge.pebble.util.RelativeDate.getMinutes()
  }

  public long getSeconds() {
    return (((time % DAY) % HOUR) % MINUTE) / SECOND;
    //#relativedate.java:71: method: long net.sourceforge.pebble.util.RelativeDate.getSeconds()
    //#input(long getSeconds()): this
    //#input(long getSeconds()): this.time
    //#output(long getSeconds()): return_value
    //#pre[5] (long getSeconds()): init'ed(this.time)
    //#post(long getSeconds()): return_value == (((this.time%86_400_000)%3_600_000)%60_000)/1_000
    //#post(long getSeconds()): return_value in -59..59
    //#relativedate.java:71: end of method: long net.sourceforge.pebble.util.RelativeDate.getSeconds()
  }

}
    //#output(net.sourceforge.pebble.util.RelativeDate__static_init): __Descendant_Table[net/sourceforge/pebble/util/RelativeDate]
    //#output(net.sourceforge.pebble.util.RelativeDate__static_init): __Dispatch_Table.getDays()J
    //#output(net.sourceforge.pebble.util.RelativeDate__static_init): __Dispatch_Table.getHours()J
    //#output(net.sourceforge.pebble.util.RelativeDate__static_init): __Dispatch_Table.getMinutes()J
    //#output(net.sourceforge.pebble.util.RelativeDate__static_init): __Dispatch_Table.getSeconds()J
    //#post(net.sourceforge.pebble.util.RelativeDate__static_init): __Descendant_Table[net/sourceforge/pebble/util/RelativeDate] == &__Dispatch_Table
    //#post(net.sourceforge.pebble.util.RelativeDate__static_init): __Dispatch_Table.getDays()J == &getDays
    //#post(net.sourceforge.pebble.util.RelativeDate__static_init): __Dispatch_Table.getHours()J == &getHours
    //#post(net.sourceforge.pebble.util.RelativeDate__static_init): __Dispatch_Table.getMinutes()J == &getMinutes
    //#post(net.sourceforge.pebble.util.RelativeDate__static_init): __Dispatch_Table.getSeconds()J == &getSeconds
    //#relativedate.java:: end of method: net.sourceforge.pebble.util.RelativeDate.net.sourceforge.pebble.util.RelativeDate__static_init
    //#relativedate.java:: end of class: net.sourceforge.pebble.util.RelativeDate
