TimePeriod.java Source code

Java tutorial

Introduction

Here is the source code for TimePeriod.java

Source

//package jsslib.util;

import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;

/**
 * Dieses Objekt reprsentiert einen Zeitraum
 * 
 * @author Robert Schuster
 */
public class TimePeriod implements Serializable {
    private static final long serialVersionUID = 814416355886171850L;

    public GregorianCalendar from;
    public GregorianCalendar to;

    // Konstanten fr der Typ des Zeitraums
    public final static int TODAY = 0;
    public final static int YESTERDAY = 1;
    public final static int THIS_WEEK = 2;
    public final static int LAST_WEEK = 3;
    public final static int THIS_MONTH = 4;
    public final static int LAST_MONTH = 5;
    public final static int THIS_JEAR = 6;
    public final static int LAST_JEAR = 7;
    public final static int EVER = 8;
    public int typ = -1;
    public int from_typ = -1;
    public int to_typ = -1;

    // Ein Tag in Millisekunden:
    public final static long ONE_DAY = 86400000L;

    // One hour in ms
    public final static long ONE_HOUR = 3600000L;

    // One minute in ms
    public final static long ONE_MIN = 60000L;

    /**
     * Ohne einen Parameter wird von und bis auf jetzt gesetzt
     */
    public TimePeriod() {
        from = new GregorianCalendar();
        to = new GregorianCalendar();
    }

    /**
     * Von und bis werden auf einen Zeitraum gesetzt, der durch den typ bestimmt
     * ist
     * 
     * @param typ
     *            siehe Konstanten!
     */
    public TimePeriod(int typ) {
        this.typ = typ;
        this.from_typ = typ;
        this.to_typ = typ;
        setFromTyp(typ);
        setToTyp(typ);
    }

    /**
     * Setzt den von-Wert auf einen der Standard-Typen
     * 
     * @param neuertyp
     */
    public void setFromTyp(int neuertyp) {
        this.from_typ = neuertyp;
        if (from_typ != to_typ)
            typ = -1;
        else
            typ = neuertyp;
        switch (neuertyp) {
        case TODAY:
            from = new GregorianCalendar();
            setMidnight(from);
            break;
        case YESTERDAY:
            from = new GregorianCalendar();
            setMidnight(from);
            from.setTimeInMillis(from.getTimeInMillis() - ONE_DAY);
            break;
        case THIS_WEEK:
            from = new GregorianCalendar();
            setMidnight(from);
            int day_of_week = from.get(Calendar.DAY_OF_WEEK);
            // unsere Woche beginnt am Montag. Montag hat den Wert 2
            int day_offset_von;
            // wenn es sonntag ist, wird die zurck liegende woche betrachtet
            if (day_of_week == 1) {
                day_offset_von = -6;
            } else {
                day_offset_von = 2 - day_of_week;
            }
            // bis ist logischerweise 6-Tage nach von
            from.setTimeInMillis(from.getTimeInMillis() + ONE_DAY * day_offset_von);
            break;
        case LAST_WEEK:
            // wie diese woche, nur 7 tage weiter zurck
            from = new GregorianCalendar();
            setMidnight(from);
            int day_of_week2 = from.get(Calendar.DAY_OF_WEEK);
            // unsere Woche beginnt am Montag. Montag hat den Wert 2
            int day_offset_von2;
            // wenn es sonntag ist, wird die zurck liegende woche betrachtet
            if (day_of_week2 == 1) {
                day_offset_von2 = -13;
            } else {
                day_offset_von2 = -5 - day_of_week2;
            }
            from.setTimeInMillis(from.getTimeInMillis() + ONE_DAY * day_offset_von2);
            break;
        case THIS_MONTH:
            from = new GregorianCalendar();
            setMidnight(from);
            from.set(Calendar.DAY_OF_MONTH, 1);
            break;
        case LAST_MONTH:
            from = new GregorianCalendar();
            setMidnight(from);
            from.set(Calendar.DAY_OF_MONTH, 1);
            // der erste tag des letzten Monats ist vielleicht nicht mehr in
            // diesem Jahr, also
            // rckwrts laufen, bis wieder ein erster Tag gefunden wird
            from.setTimeInMillis(from.getTimeInMillis() - ONE_DAY);
            while (from.get(Calendar.DAY_OF_MONTH) != 1)
                from.setTimeInMillis(from.getTimeInMillis() - ONE_DAY);
            break;
        case THIS_JEAR:
            from = new GregorianCalendar();
            setMidnight(from);
            from.set(Calendar.DAY_OF_MONTH, 1);
            from.set(Calendar.MONTH, 0);
            break;
        case LAST_JEAR:
            from = new GregorianCalendar();
            int jahr = from.get(Calendar.YEAR);
            jahr--;
            setMidnight(from);
            from.set(Calendar.DAY_OF_MONTH, 1);
            from.set(Calendar.MONTH, 0);
            from.set(Calendar.YEAR, jahr);
            break;
        case EVER:
            from = new GregorianCalendar();
            int jahr2 = from.get(Calendar.YEAR);
            setMidnight(from);
            from.set(2000, 0, 1, 0, 0, 0);
            break;
        }
        // Von darf nicht nach bis liegen, ist bis schon initialisiert, so muss
        // es angepasst werden
        if (to != null)
            if (to.before(from)) {
                to.setTimeInMillis(from.getTimeInMillis());
                set2359(to);
                if (from_typ == TODAY)
                    to_typ = TODAY;
            }
    }

    /**
     * Setzt den bis-Wert auf einen der Standard-Typen
     * 
     * @param neuertyp
     */
    public void setToTyp(int neuertyp) {
        this.to_typ = neuertyp;
        if (from_typ != to_typ)
            typ = -1;
        else
            typ = neuertyp;
        switch (neuertyp) {
        case TODAY:
            to = new GregorianCalendar();
            set2359(to);
            break;
        case YESTERDAY:
            to = new GregorianCalendar();
            set2359(to);
            to.setTimeInMillis(to.getTimeInMillis() - ONE_DAY);
            break;
        case THIS_WEEK:
            to = new GregorianCalendar();
            int day_of_week = to.get(Calendar.DAY_OF_WEEK);
            // unsere Woche beginnt am Montag. Montag hat den Wert 2
            int day_offset_von;
            // wenn es sonntag ist, wird die zurck liegende woche betrachtet
            if (day_of_week == 1) {
                day_offset_von = -6;
            } else {
                day_offset_von = 2 - day_of_week;
            }
            // bis ist logischerweise 6-Tage nach von
            int day_offset_bis = day_offset_von + 6;
            set2359(to);
            to.setTimeInMillis(to.getTimeInMillis() + ONE_DAY * day_offset_bis);
            break;
        case LAST_WEEK:
            // wie diese woche, nur 7 tage weiter zurck
            to = new GregorianCalendar();
            int day_of_week2 = to.get(Calendar.DAY_OF_WEEK);
            // unsere Woche beginnt am Montag. Montag hat den Wert 2
            int day_offset_von2;
            // wenn es sonntag ist, wird die zurck liegende woche betrachtet
            if (day_of_week2 == 1) {
                day_offset_von2 = -13;
            } else {
                day_offset_von2 = -5 - day_of_week2;
            }
            // bis ist logischerweise 6-Tage nach von
            int day_offset_bis2 = day_offset_von2 + 6;
            set2359(to);
            to.setTimeInMillis(to.getTimeInMillis() + ONE_DAY * day_offset_bis2);
            break;
        case THIS_MONTH:
            GregorianCalendar temp = new GregorianCalendar();
            setMidnight(temp);
            temp.set(Calendar.DAY_OF_MONTH, 1);
            to = new GregorianCalendar();
            set2359(to);
            // wann der letzte tag im monat ist ist unklar, also solange weiter
            // gehen,
            // bis der neue monat anfngt, dann einen tag zurck
            while (to.get(Calendar.MONTH) == temp.get(Calendar.MONTH))
                to.setTimeInMillis(to.getTimeInMillis() + ONE_DAY);
            // Jetzt wieder einen tag zurck
            to.setTimeInMillis(to.getTimeInMillis() - ONE_DAY);
            break;
        case LAST_MONTH:
            GregorianCalendar temp2 = new GregorianCalendar();
            setMidnight(temp2);
            temp2.set(Calendar.DAY_OF_MONTH, 1);
            // der erste tag des letzten Monats ist vielleicht nicht mehr in
            // diesem Jahr, also
            // rckwrts laufen, bis wieder ein erster Tag gefunden wird
            temp2.setTimeInMillis(temp2.getTimeInMillis() - ONE_DAY);
            to = new GregorianCalendar();
            to.setTimeInMillis(temp2.getTimeInMillis());
            set2359(to);
            break;
        case THIS_JEAR:
            to = new GregorianCalendar();
            set2359(to);
            to.set(Calendar.MONTH, 11);
            to.set(Calendar.DAY_OF_MONTH, 31);
            break;
        case LAST_JEAR:
            to = new GregorianCalendar();
            int jahr = to.get(Calendar.YEAR);
            jahr--;
            set2359(to);
            to.set(Calendar.MONTH, 11);
            to.set(Calendar.DAY_OF_MONTH, 31);
            to.set(Calendar.YEAR, jahr);
            break;
        case EVER:
            to = new GregorianCalendar();
            int jahr2 = to.get(Calendar.YEAR);
            set2359(to);
            to.set(Calendar.MONTH, 11);
            to.set(Calendar.DAY_OF_MONTH, 31);
            to.set(Calendar.YEAR, jahr2);
            break;
        }
        // Von darf nicht nach bis liegen, ist bis schon initialisiert, so muss
        // es angepasst werden
        if (from != null)
            if (to.before(from)) {
                from.setTimeInMillis(to.getTimeInMillis());
                setMidnight(from);
                from_typ = to_typ;
            }
    }

    /**
     * Erniedrigt den Von-Wert um einen Tag und prft, ob es sich dabei dann um
     * heute handelt.
     */
    public void setFromMinusOneDay() {
        from.setTimeInMillis(from.getTimeInMillis() - ONE_DAY);
        GregorianCalendar heute = new GregorianCalendar();
        setMidnight(heute);
        if (from.getTimeInMillis() == heute.getTimeInMillis())
            from_typ = TODAY;
        else
            from_typ = -1;
        if (to.before(from)) {
            to.setTimeInMillis(from.getTimeInMillis());
            set2359(to);
            to_typ = from_typ;
        }
    }

    /**
     * Erhht den Von-Wert um einen Tag und prft, ob es sich dabei dann um
     * heute handelt.
     */
    public void setFromPlusOneDay() {
        from.setTimeInMillis(from.getTimeInMillis() + ONE_DAY);
        GregorianCalendar heute = new GregorianCalendar();
        setMidnight(heute);
        if (from.getTimeInMillis() == heute.getTimeInMillis())
            from_typ = TODAY;
        else
            from_typ = -1;
        // Bis darf nicht vor von liegen! Falls es doch der Fall sein sollte,
        // wird auch bis angepasst
        if (to.before(from)) {
            to.setTimeInMillis(from.getTimeInMillis());
            set2359(to);
            to_typ = from_typ;
        }
    }

    /**
     * Erniedrigt den Von-Wert um einen Tag und prft, ob es sich dabei dann um
     * heute handelt.
     */
    public void setToMinusOneDay() {
        to.setTimeInMillis(to.getTimeInMillis() - ONE_DAY);
        GregorianCalendar heute = new GregorianCalendar();
        set2359(heute);
        if (to.getTimeInMillis() == heute.getTimeInMillis())
            to_typ = TODAY;
        else
            to_typ = -1;
        // Bis darf nicht vor von liegen! Falls es doch der Fall sein sollte,
        // wird auch von angepasst
        if (to.before(from)) {
            from.setTimeInMillis(to.getTimeInMillis());
            setMidnight(from);
            from_typ = to_typ;
        }
    }

    /**
     * Erhht den Von-Wert um einen Tag und prft, ob es sich dabei dann um
     * heute handelt.
     */
    public void setToPlusOneDay() {
        to.setTimeInMillis(to.getTimeInMillis() + ONE_DAY);
        GregorianCalendar heute = new GregorianCalendar();
        set2359(heute);
        if (to.getTimeInMillis() == heute.getTimeInMillis())
            to_typ = TODAY;
        else
            to_typ = -1;
        // Bis darf nicht vor von liegen! Falls es doch der Fall sein sollte,
        // wird auch von angepasst
        if (to.before(from)) {
            from.setTimeInMillis(to.getTimeInMillis());
            setMidnight(from);
        }
    }

    /**
     * Setzt die Uhr des bergebenen Kalenders auf 00:00:00:000
     * 
     * @param cal
     */
    public void setMidnight(GregorianCalendar cal) {
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MILLISECOND, 0);
    }

    /**
     * Setzt die Uhr des bergebenen Kalenders auf 23:59:59:999
     * 
     * @param cal
     */
    public void set2359(GregorianCalendar cal) {
        cal.set(Calendar.HOUR_OF_DAY, 23);
        cal.set(Calendar.MINUTE, 59);
        cal.set(Calendar.SECOND, 59);
        cal.set(Calendar.MILLISECOND, 999);
    }

    /**
     * Gibt das Datum des von-Objekts als String zurck
     * 
     * @return Format:
     */
    public String getFromString() {
        if (from == null)
            return "null";
        SimpleDateFormat formater = new SimpleDateFormat("dd.MM.yyyy HH:mm");
        return formater.format(from.getTime());
    }

    /**
     * Gibt das Datum des von-Objekts als String zurck
     * 
     * @return Format:
     */
    public String getToString() {
        if (to == null)
            return "null";
        SimpleDateFormat formater = new SimpleDateFormat("dd.MM.yyyy HH:mm");
        return formater.format(to.getTime());
    }

    public String getFromToTimeOfDayString() {
        if (to == null || from == null)
            return "null";
        SimpleDateFormat formater = new SimpleDateFormat("HH:mm");
        return formater.format(from.getTime()) + " - " + formater.format(to.getTime());

    }

    /**
     * Gibt das Von-Datum in der Formatierung fr die Datenbank zurck
     * 
     * @return 'yyyy-MM-dd HH:mm:ss'
     */
    public String getDatabaseFromString() {
        if (from == null)
            return "0000-01-01 00:00:00";
        SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return "'" + formater.format(from.getTime()) + "'";
    }

    /**
     * Gibt das Bis-Datum in der Formatierung fr die Datenbank zurck
     * 
     * @return 'yyyy-MM-dd HH:mm:ss'
     */
    public String getDatabaseToString() {
        if (to == null)
            return "0000-01-01 00:00:00";
        SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return "'" + formater.format(to.getTime()) + "'";
    }

    /**
     * Gibt die den Zeitabstand zwischen von und bis in Millisekunden zurck
     * 
     * @return
     */
    public long getDurationInMillis() {
        return to.getTimeInMillis() - from.getTimeInMillis();
    }

    /**
     * Gibt die den Zeitabstand zwischen von und bis in Minuten zurck
     * 
     * @return
     */
    public int getDurationInMinutes() {
        return (int) ((to.getTimeInMillis() - from.getTimeInMillis()) / 60000);
    }

    public int getDurationInDays() {
        int ergebnis = 0;
        int bistag = (int) (to.getTimeInMillis() / ONE_DAY);
        int vontag = (int) (from.getTimeInMillis() / ONE_DAY);
        ergebnis = bistag - vontag + 1;
        return ergebnis;
    }

    /**
     * Krzt den zeitraum, so das nur ganze Monate brig bleiben
     */
    public void setOnlyCompleteMonth() {
        // Auf den Beginn des nchsten monats setzen
        if (from.get(Calendar.DAY_OF_MONTH) != 1) {
            while (from.get(Calendar.DAY_OF_MONTH) != 1) {
                from.setTimeInMillis(from.getTimeInMillis() + ONE_DAY);
            }
            setMidnight(from);
        }
        // Auf das Ende des Vorherigen Monats setzen
        GregorianCalendar temp = new GregorianCalendar();
        temp.setTimeInMillis(to.getTimeInMillis() + ONE_DAY);
        if (temp.get(Calendar.MONTH) == to.get(Calendar.MONTH)) {
            while (to.get(Calendar.MONTH) == temp.get(Calendar.MONTH)) {
                to.setTimeInMillis(to.getTimeInMillis() - ONE_DAY);
            }
            set2359(to);
        }
    }

    /**
     * Gibt die Anzahl der Monate zurck, dabei wird aufgerundet
     * 
     * @return anzahl der angefangenen Monate, also die Monate, die einen Anteil
     *         an diesem Zeitraum haben
     */
    public int getDurationInMonth() {
        int ergebnis = 0;
        int startmonat = from.get(GregorianCalendar.MONTH);
        int startjahr = from.get(GregorianCalendar.YEAR);
        int endmonat = to.get(GregorianCalendar.MONTH);
        int endjahr = to.get(GregorianCalendar.YEAR);

        int start = startjahr * 12 + startmonat;
        int ende = endjahr * 12 + endmonat;
        ergebnis = ende - start + 1;

        return ergebnis;
    }

    /**
     * gibt von_bis-Objekte zurck, die die an diesem Zeitraum beteiligten
     * Monate enthalten
     * 
     * @return
     */
    public ArrayList<TimePeriod> getMonth() {
        ArrayList<TimePeriod> ergebnis = new ArrayList<TimePeriod>();

        int anzahl = getDurationInMonth();
        int startmonat = from.get(GregorianCalendar.MONTH);
        int startjahr = from.get(GregorianCalendar.YEAR);

        for (int i = 0; i < anzahl; i++) {
            TimePeriod temp = new TimePeriod();
            temp.setMidnight(temp.from);
            // temp.set2359(temp.bis);
            temp.from.set(Calendar.MONTH, startmonat);
            temp.from.set(Calendar.YEAR, startjahr);
            temp.from.set(Calendar.DAY_OF_MONTH, 1);
            temp.to.set(Calendar.MONTH, startmonat);
            temp.to.set(Calendar.YEAR, startjahr);
            temp.to.set(Calendar.DAY_OF_MONTH, 28);
            // wann der letzte tag im monat ist ist unklar, also solange weiter
            // gehen,
            // bis der neue monat anfngt, dann einen tag zurck
            while (temp.to.get(Calendar.MONTH) == temp.from.get(Calendar.MONTH))
                temp.to.setTimeInMillis(temp.to.getTimeInMillis() + ONE_DAY);
            // Jetzt wieder einen tag zurck
            temp.to.setTimeInMillis(temp.to.getTimeInMillis() - ONE_DAY);
            temp.set2359(temp.to);

            // Fertig! den Monat in die ArrayListe einfgen
            ergebnis.add(temp);

            // weiter zum nchsten Monat
            startmonat++;
            if (startmonat == 12) {
                startmonat = 0;
                startjahr++;
            }

        }

        return ergebnis;
    }

    /**
     * Gibt zurck, wie oft der bergebene Wochentag im Zeitraum vorkommt.
     * 
     * @param wochentag
     *            Sonntag = 1
     * @return
     */
    public int getNumberOfWeekdays(int wochentag) {
        int ergebnis = 0;
        GregorianCalendar temp = new GregorianCalendar();
        temp.setTime(from.getTime());
        // Schleife ber alle Tage
        int aktuellerTag;
        while (temp.before(to)) {
            aktuellerTag = temp.get(Calendar.DAY_OF_WEEK);
            if (aktuellerTag == wochentag)
                ergebnis++;
            temp.setTimeInMillis(temp.getTimeInMillis() + ONE_DAY);
        }
        return ergebnis;
    }
}