All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.time4j.ProportionalElement Maven / Gradle / Ivy

There is a newer version: 4.38
Show newest version
/*
 * -----------------------------------------------------------------------
 * Copyright © 2013-2014 Meno Hochschild, 
 * -----------------------------------------------------------------------
 * This file (ProportionalElement.java) is part of project Time4J.
 *
 * Time4J is free software: You can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as published
 * by the Free Software Foundation, either version 2.1 of the License, or
 * (at your option) any later version.
 *
 * Time4J is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with Time4J. If not, see .
 * -----------------------------------------------------------------------
 */

package net.time4j;

import net.time4j.engine.ChronoEntity;
import net.time4j.engine.ChronoFunction;
import net.time4j.engine.ChronoOperator;

import java.math.BigDecimal;


/**
 * 

Defines an element which can interprete its value as proportional * value.

* * @param generic number type of element values * @param generic type of target entity an operator is applied to * @author Meno Hochschild */ /*[deutsch] *

Definiert ein Element, das seinen Wert als Proportionalwert * interpretieren kann.

* * @param generic number type of element values * @param generic type of target entity an operator is applied to * @author Meno Hochschild */ public interface ProportionalElement extends AdjustableElement { //~ Methoden ---------------------------------------------------------- /** *

Defines a query which interpretes the value of this element as * proportional rational number within the range between minimum and * maximum.

* *

Smaller elements with greater precision are not taken in account. * Following expression serves as formula for internal calculation: * {@code (value - min) / (max - min + 1)}. Example:

* *
     *  import static net.time4j.PlainTime.MINUTE_OF_HOUR;
     *
     *  PlainTime time = PlainTime.of(12, 45, 30); // T12:45:30
     *  System.out.println(time.get(MINUTE_OF_HOUR.ratio()));
     *  // output: 0.75 [= (45 - 0) / (59 - 0 + 1)]
     * 
* *

Note: In timezone-related timestamps possible jumps in local time * will be conserved. That means that minimum and maximum do not take * in account if they fall into a daylight saving gap or if there is * any kind of offset shift between them.

* * @return query for proportional value */ /*[deutsch] *

Definiert eine Abfrage, die den Wert dieses Elements als * Verhältniszahl innerhalb seines Bereichs zwischen Minimum * und Maximum interpretiert.

* *

Kleinere Elemente mit größerer Genauigkeit werden in der * Berechnung nicht berücksichtigt. Als Formel wird der Ausdruck * {@code (value - min) / (max - min + 1)} verwendet. Beispiel:

* *
     *  import static net.time4j.PlainTime.MINUTE_OF_HOUR;
     *
     *  PlainTime time = PlainTime.of(12, 45, 30); // T12:45:30
     *  System.out.println(time.get(MINUTE_OF_HOUR.ratio()));
     *  // Ausgabe: 0.75 [= (45 - 0) / (59 - 0 + 1)]
     * 
* *

Zu beachten: In zeitzonen-bezogenen Zeitstempeln bleiben eventuelle * Zeitzonensprünge erhalten. Das bedeutet, daß Minimum und * Maximum nicht berücksichtigen, ob sie in eine Lücke fallen * oder zwischen ihnen ein Offset-Sprung existiert.

* * @return query for proportional value */ ChronoFunction, BigDecimal> ratio(); /** *

Adjusts any kind of entity such that this element will be set to * the given value in lenient mode.

* *
     *  import static net.time4j.PlainDate.MONTH_OF_YEAR;
     *
     *  System.out.println(
     *      PlainDate.of(2011, 5, 31).with(MONTH_OF_YEAR.setLenient(13)));
     *  // output: 2012-01-31 (addition of 13 - 5 = 8 Monaten)
     * 
* *

Leniency does not always prevent exceptions. For example setting * of extreme values like {@code Long.MIN_VALUE} can cause an * {@code ArithmeticException}. Furthermore, moving the value of * {@code SECOND_OF_MINUTE} to the past applied on a {@code Moment} * can trigger a {@code ChronoException} if this action changes to * the pre-UTC-era before 1972.

* * @param value new value to be set in lenient way * @return operator directly applicable also on {@code PlainTimestamp} */ /*[deutsch] *

Passt eine beliebige Entität so an, daß dieses Element * auf den angegebenen Wert im Nachsichtigkeitsmodus gesetzt wird.

* *
     *  import static net.time4j.PlainDate.MONTH_OF_YEAR;
     *
     *  System.out.println(
     *      PlainDate.of(2011, 5, 31).with(MONTH_OF_YEAR.setLenient(13)));
     *  // Ausgabe: 2012-01-31 (Addition von 13 - 5 = 8 Monaten)
     * 
* *

Nachsichtigkeit bedeutet nicht, daß eine Ausnahme * unmöglich ist. Zum Beispiel kann das Setzen von extremen Werten * wie {@code Long.MIN_VALUE} eine {@code ArithmeticException} verursachen. * Auch kann etwa das Setzen des Elements {@code SECOND_OF_MINUTE} * auf einen {@code Moment} angewandt eine {@code ChronoException} * auslösen, wenn damit ein Wechsel von der UTC-Ära in die * UT-Ära vor 1972 verbunden ist.

* * @param value new value to be set in lenient way * @return operator directly applicable also on {@code PlainTimestamp} */ ElementOperator setLenient(V value); /** *

Rounds this chronological element up and makes its numerical * value an integral multiple of given step width if possible.

* *
     *  import static net.time4j.PlainTime.MINUTE_OF_HOUR;
     *
     *  System.out.println(
     *      PlainTime.of(18, 38).with(MINUTE_OF_HOUR.roundedUp(15)));
     *  // output: T18:45
     * 
* *

The new element value will always be set in lenient mode. * Example:

* *
     *  import static net.time4j.PlainTime.MINUTE_OF_HOUR;
     *
     *  System.out.println(
     *      PlainTime.of(18, 49).with(MINUTE_OF_HOUR.roundedUp(15)));
     *  // output: T19 corresponding to T18:60 (60 as multiple of 15)
     * 
* * @param stepwidth controls the limits within the rounding will occur * @return rounding operator in ceiling mode * @see #roundedDown(int) */ /*[deutsch] *

Rundet dieses chronologische Element so auf, daß sein * numerischer Wert möglichst ein ganzzahliges Vielfaches der * angegebenen Schrittweite annimmt.

* *
     *  import static net.time4j.PlainTime.MINUTE_OF_HOUR;
     *
     *  System.out.println(
     *      PlainTime.of(18, 38).with(MINUTE_OF_HOUR.roundedUp(15)));
     *  // Ausgabe: T18:45
     * 
* *

Der neu errechnete Elementwert wird immer nachsichtig mittels * {@link #setLenient(Number)} gesetzt. Beispiel:

* *
     *  import static net.time4j.PlainTime.MINUTE_OF_HOUR;
     *
     *  System.out.println(
     *      PlainTime.of(18, 49).with(MINUTE_OF_HOUR.roundedUp(15)));
     *  // Ausgabe: T19 entsprechend T18:60 (60 als Vielfaches von 15)
     * 
* * @param stepwidth controls the limits within the rounding will occur * @return rounding operator in ceiling mode * @see #roundedDown(int) */ ChronoOperator roundedUp(int stepwidth); /** *

Rounds this chronological element up or down and makes its * numerical value an integral multiple of given step width if * possible.

* *
     *  import static net.time4j.PlainTime.MINUTE_OF_HOUR;
     *
     *  System.out.println(
     *      PlainTime.of(18, 38).with(MINUTE_OF_HOUR.roundedHalf(15)));
     *  // output: T18:45
     *  System.out.println(
     *      PlainTime.of(18, 37).with(MINUTE_OF_HOUR.roundedHalf(15)));
     *  // output: T18:30
     * 
* *

The new element value will always be set in lenient mode. Is the * current value nearer to the lower limit then this function will * round down else round up.

* * @param stepwidth controls the limits within the rounding will occur * @return rounding operator in ceiling or floor mode dependent on * actual element value * @see #roundedUp(int) * @see #roundedDown(int) */ /*[deutsch] *

Rundet dieses chronologische Element auf oder ab und stellt * sicher, daß sein numerischer Wert möglichst ein * ganzzahliges Vielfaches der angegebenen Schrittweite annimmt.

* *
     *  import static net.time4j.PlainTime.MINUTE_OF_HOUR;
     *
     *  System.out.println(
     *      PlainTime.of(18, 38).with(MINUTE_OF_HOUR.roundedHalf(15)));
     *  // Ausgabe: T18:45
     *  System.out.println(
     *      PlainTime.of(18, 37).with(MINUTE_OF_HOUR.roundedHalf(15)));
     *  // Ausgabe: T18:30
     * 
* *

Der neu errechnete Elementwert wird immer nachsichtig mittels * {@link #setLenient(Number)} gesetzt. Ist der aktuelle Wert näher * an der unteren Grenze, dann wird abgerundet, sonst aufgerundet.

* * @param stepwidth controls the limits within the rounding will occur * @return rounding operator in ceiling or floor mode dependent on * actual element value * @see #roundedUp(int) * @see #roundedDown(int) */ ChronoOperator roundedHalf(int stepwidth); /** *

Rounds this chronological element down and makes its numerical * value an integral multiple of given step width if possible.

* *
     *  import static net.time4j.PlainTime.MINUTE_OF_HOUR;
     *
     *  System.out.println(
     *      PlainTime.of(18, 38).with(MINUTE_OF_HOUR.roundedDown(15)));
     *  // output: T18:30
     * 
* *

The new element value will always be set in lenient mode. * Example:

* *
     *  import static net.time4j.PlainTime.CLOCK_HOUR_OF_DAY;
     *
     *  System.out.println(
     *      PlainTime.of(2, 30).with(CLOCK_HOUR_OF_DAY.roundedDown(3)));
     *  // output: T0
     * 
* * @param stepwidth controls the limits within the rounding will occur * @return rounding operator in floor mode * @see #roundedUp(int) */ /*[deutsch] *

Rundet dieses chronologische Element so ab, daß sein * numerischer Wert möglichst ein ganzzahliges Vielfaches der * angegebenen Schrittweite annimmt.

* *
     *  import static net.time4j.PlainTime.MINUTE_OF_HOUR;
     *
     *  System.out.println(
     *      PlainTime.of(18, 38).with(MINUTE_OF_HOUR.roundedDown(15)));
     *  // Ausgabe: T18:30
     * 
* *

Der neu errechnete Elementwert wird immer nachsichtig mittels * {@link #setLenient(Number)} gesetzt. Beispiel:

* *
     *  import static net.time4j.PlainTime.CLOCK_HOUR_OF_DAY;
     *
     *  System.out.println(
     *      PlainTime.of(2, 30).with(CLOCK_HOUR_OF_DAY.roundedDown(3)));
     *  // Ausgabe: T0
     * 
* * @param stepwidth controls the limits within the rounding will occur * @return rounding operator in floor mode * @see #roundedUp(int) */ ChronoOperator roundedDown(int stepwidth); }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy