Frage

Ich brauche einige Informationen über Jahreszeit modellieren, und müssen sie in einem Jahr unabhängige Art und Weise basierend auf Start- / Enddatum verfolgen. D. h Ich brauche, damit die Benutzer Sommer definieren als zwischen, sagen wir, 15. Mai und 10. September und tun, dass für alle Jahre.

Ich brauche eine Menge Überprüfung des Typs isThisDateInSeason) zu tun. Alles Datum Manipulationsfunktionen (d Datum, Kalender) scheinen nur mit gültigem Datum zu arbeiten, das heißt einschließlich Jahr Informationen.

Gibt es Best Practices, wie dies zu tun? Ich kann mich ein Bündel von Hacky Möglichkeiten, es (dh Speicher Monat und Tag des Monats oder Daten zu speichern und sie nur auf ein Basisjahr zu bringen, damit ich vergleichen kann) zu tun, aber es scheint, wie könnte es ein besserer Weg, .

Ich schreibe dies in Java oder Groovy.

Würde der Joda-Time Bibliothek Hilfe hier? Ich habe keine Erfahrung damit, aber es sieht viel mehr Flexibilität haben.

Ich fand diese Frage darüber, wie ein identifizieren Saison ab dem Datum, aber das konzentriert sich auf die Monate, und ich brauche mehr Flexibilität Daten aufzunehmen.

War es hilfreich?

Lösung

Wenn jeder Benutzer seine eigenen Daten besitzt (dh sie ihren Jahreszeiten angeben und geben sie ihre eigenen Informationen), dann könnten Sie speichern die Daten nur mit der Saison als Teil davon, aber ich habe das Gefühl, das Szenario, das Sie nach sind, ist für gemeinsam genutzte Daten über zahlreiche Anwender, die Jahreszeit anders definieren.

Sie würden sehr vorsichtig ‚normalisieren‘ sein müssen, geht als Schaltjahr kann es zu unerwarteten Problemen führen, das heißt die versuchen, auf einem nicht Schaltjahr zu setzen 29. Februar wird Probleme / Ausnahmen führen.

Ich habe die unten zusammen, unforutnatly seine c # aber das Konzept wird das gleiche sein. Ich havnt den Code tatsächlich getestet, aber als auch als psudo Code kann es helfen.

public class SeasonChecker
{
    public enum Season {Summer, Autumn, Winter, Spring};
    private List<SeasonRange> _seasons = new List<SeasonRange>();

    public void DefineSeason(Season season, DateTime starting, DateTime ending)
    {
        starting = starting.Date;
        ending = ending.Date;

        if(ending.Month < starting.Month)
        {
            // split into 2
            DateTime tmp_ending = new DateTime(ending.Year, 12, 31);
            DateTime tmp_starting = new DateTime(starting.Year, 1, 1);

            SeasonRange r1 = new SeasonRange() { Season = season, Starting= tmp_starting, Ending = ending };
            SeasonRange r2 = new SeasonRange() { Season = season, Starting= starting, Ending = tmp_ending };

            this._seasons.Add(r1);
            this._seasons.Add(r2);
        }
        else
        {
            SeasonRange r1 = new SeasonRange() { Season = season, Starting= starting, Ending = ending };
            this._seasons.Add(r1);
        }
    }

    public Season GetSeason(DateTime check)
    {
        foreach(SeasonRange range in _seasons)
        {
            if(range.InRange(check))
                return range.Season;
        }

        throw new ArgumentOutOfRangeException("Does not fall into any season");
    }


    private class SeasonRange
    {
        public DateTime Starting;
        public DateTime Ending;
        public Season Season;

        public bool InRange(DateTime test)
        {
            if(test.Month == Starting.Month)
            {
                if(test.Day >= Starting.Day)
                {
                    return true;
                }
            }
            else if(test.Month == Ending.Month)
            {
                if(test.Day <= Ending.Day)
                {
                    return true;
                }
            }
            else if(test.Month > Starting.Month && test.Month < Ending.Month)
            {
                return true;
            }

            return false;
        }

    }
}

Beachten Sie den obigen Code die Annahme macht, dass die Saison beginnt und endet nicht im selben Monat - eine ziemlich sichere, den ich denke,

Andere Tipps

Ich denke, Sie Ihre eigene Klasse Daterange rollen müssen, obwohl dies so ein häufiges Problem ist, würden Sie hoffen, dass es bereits eine clevere util gibt, die es tut. Als allgemeiner Punkt, wenn sie mit Jahreszeit zu tun Sie müssen auch wegen der Geographie nehmen, was das Leben wirklich schwer machen wird. In Oz sind wir das Gegenteil von den USA, so Sommer von November bis Februar läuft.

Wo sind die Daten? Wenn es in einer Datenbank ist, würde ich prüfen, für Termine einen Tisch zu machen (wie eine Zeitdimension in OLAP). Sie können dann eine Spalte für Ihre Jahreszeiten berechnen, wie sie in in einigen Zeitdimension Beispiele für Finanz-Viertel sind. (Dies wird unter der Annahme, dass Ihre Saison ändert sich nicht, aber hat Fixtermine).

All „wenn das Datum in der Saison“ Typprüfung wird die Kosten für die Berechnung der Saison in der Rüstzeit vorgefertigtes drängt eher dann Ihre Laufzeit.

Edit: Gerade gesehen, Ihren Kommentar zu vom Benutzer konfigurierbaren Saisonzeiten. Dies würde immer noch funktionieren, wie Sie tun können, ein mit der Zeitdimension in einer Datenbank, die mit dem Satz von Daten dann in Java einfacher arbeiten könnten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top