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

de.bund.bva.isyfact.datetime.util.DateTimeUtil Maven / Gradle / Ivy

The newest version!
package de.bund.bva.isyfact.datetime.util;

import java.time.Clock;
import java.time.DateTimeException;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.OffsetDateTime;
import java.time.OffsetTime;
import java.time.ZonedDateTime;
import java.util.Objects;

/**
 * Utility-Funktionen für Datums- und Zeitberechnungen und Zeitabfragen.
 *
 */
public abstract class DateTimeUtil {

    private static Clock clock = Clock.systemDefaultZone();

    public static Clock getClock() {
        return clock;
    }

    public static void setClock(Clock clock) {
        Objects.requireNonNull(clock);

        DateTimeUtil.clock = clock;
    }

    /**
     * Prüft, ob ein Datum zwischen zwei anderen Datumswerten liegt.
     *
     * @param datum
     *     Datum das geprüft werden soll
     * @param anfang
     *     Startwert
     * @param ende
     *     Endwert
     * @return true, wenn anfang <= datum <= ende
     * @throws DateTimeException
     *     wenn anfang nach ende liegt
     */
    public static boolean datumLiegtZwischen(LocalDate datum, LocalDate anfang, LocalDate ende) {
        Objects.requireNonNull(datum);
        Objects.requireNonNull(anfang);
        Objects.requireNonNull(ende);

        if (ende.isBefore(anfang)) {
            throw new DateTimeException("Das Enddatum " + ende + " liegt vor dem Anfangsdatum " + anfang);
        }

        return (datum.isEqual(anfang) || datum.isAfter(anfang)) && (datum.isBefore(ende) || datum
            .isEqual(ende));
    }

    /**
     * Prüft, ob ein Datum zwischen zwei anderen Datumswerten liegt, wobei das Anfangs- und das End-Datum
     * außerhalb des Bereiches liegen.
     *
     * @param datum
     *     Datum das geprüft werden soll
     * @param anfang
     *     Startwert
     * @param ende
     *     Endwert
     * @return true, wenn anfang < datum < ende
     * @throws DateTimeException
     *     wenn anfang nach ende liegt
     */
    public static boolean datumLiegtZwischenExklusive(LocalDate datum, LocalDate anfang, LocalDate ende) {
        Objects.requireNonNull(datum);
        Objects.requireNonNull(anfang);
        Objects.requireNonNull(ende);

        if (ende.isBefore(anfang)) {
            throw new DateTimeException("Das Enddatum " + ende + " liegt vor dem Anfangsdatum " + anfang);
        }

        return datum.isAfter(anfang) && datum.isBefore(ende);
    }

    /**
     * Liefert den 1.1. des Jahres zurück, in dem sich das übergebene Datum befindet.
     *
     * @param datum
     *     das Datum als {@link LocalDate}, das in dem Jahr liegt
     * @return der erste Januar des Jahres, in dem das übergebene Datum liegt; alle weiteren Anteile
     * sind 0; null, wenn das übergebene Datum null ist.
     */
    public static LocalDate getJahresanfang(LocalDate datum) {
        return datum == null ? null : datum.withDayOfYear(1);
    }

    /**
     * Liefert den 1. des Monats zurück, in dem sich das übergebene Datum befindet.
     *
     * @param datum
     *     das Datum als {@link LocalDate}, das in dem Jahr liegt
     * @return der erste Tag des Monats, in dem das übergebene Datum liegt; alle weiteren Zeitanteile
     * sind 0; null, wenn das übergebene Datum null ist.
     */
    public static LocalDate getMonatsanfang(LocalDate datum) {
        return datum == null ? null : datum.withDayOfMonth(1);
    }

    /**
     * Liefert den letzten Tag des Monats zurück, in dem sich das übergebene Datum befindet.
     *
     * @param datum
     *     das Datum als {@link LocalDate}, das in dem Monat liegt
     * @return der letzte Tag des Monats, in dem das übergebene Datum liegt; alle weiteren Zeitanteile
     * sind 0; null, wenn das übergebene Datum null ist.
     */
    public static LocalDate getMonatsende(LocalDate datum) {
        return datum == null ? null : datum.withDayOfMonth(datum.getMonth().length(datum.isLeapYear()));
    }

    /**
     * Liefert den nächsten Werktag (Montag), wenn das eingegebene Datum ein Sonntag ist. Ansonsten wird das
     * eingegebene Datum zurückgeliefert.
     *
     * @param datum
     *     Das Datum, das um einen Tag erhöht werden soll, wenn es sich um einen Sonntag handelt.
     * @return Der nächste Montag, falls das eingegebene Datum ein Sonntag ist. Sonst das eingegebene Datum.
     */
    public static LocalDate getWerktag(LocalDate datum) {
        Objects.requireNonNull(datum);

        return datum.getDayOfWeek() == DayOfWeek.SUNDAY ? datum.plusDays(1) : datum;
    }

    public static LocalTime localTimeNow() {
        return LocalTime.now(clock);
    }

    public static LocalDate localDateNow() {
        return LocalDate.now(clock);
    }

    public static LocalDateTime localDateTimeNow() {
        return LocalDateTime.now(clock);
    }

    public static OffsetTime offsetTimeNow() {
        return OffsetTime.now(clock);
    }

    public static OffsetDateTime offsetDateTimeNow() {
        return OffsetDateTime.now(clock);
    }

    public static ZonedDateTime zonedDateTimeNow() {
        return ZonedDateTime.now(clock);
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy