Laden...

Timeslot bestimmen

Erstellt von Grimmbizkit vor 2 Jahren Letzter Beitrag vor 2 Jahren 368 Views
G
Grimmbizkit Themenstarter:in
308 Beiträge seit 2006
vor 2 Jahren
Timeslot bestimmen

Hallo zusammen,

leider bin ich bei der Suche nicht fündig geworden und bevor ich das Rad neu erfinde, dachte ich frage mal kurz nach.

Hat jemand schon mal einen DatumZeit (hier nur die Zeit) in einen TimeSlot(Int) konvertiert?

Also man sagt


GetTimeSlot(DateTime time, Int32 slotMinutes)
{
   // time = Datum und/oder Zeit für die Berechnung
   // slotMinutes = Minuten die ein Slot groß ist.
}

Das man wenn man die Aktuelle Uhrzeit übergibt dann eine Zahl bekommt welcher Slot das vom Start des Datum ist.
Im Grunde
GetTimeSlot(DateTime.Now, 10) // hier mal 9:36:00 und 10 Minuten Slots
Das würde mir dann 58 zurückgeben

Vielen Dank falls mir jemand helfen kann.

Gruß Simon

4.931 Beiträge seit 2008
vor 2 Jahren

Das wirst du doch selber hinbekommen, aus den Stunden und Minuten den Wert zu ermitteln...

G
Grimmbizkit Themenstarter:in
308 Beiträge seit 2006
vor 2 Jahren

Hi,

ich habe es nun so selber gelöst:


        public Int32 GetTimeSlot(DateTime time, Int32 slotMinutes)
        {
            DateTime time2 = DateTime.Today;

            for (int i = 0; i < (1440 / slotMinutes); i++)
            {
                //System.Console.WriteLine("Timeslot (" + time2 + " -> " +time2.AddMinutes(slotMinutes) + ")");

                if ((time.Ticks >= time2.Ticks) && (time.Ticks < time2.AddMinutes(slotMinutes).Ticks))
                {
                    //System.Console.WriteLine("TIMESLOT " + i + " -> " + time);
                    return i;
                }

                time2 = time2.AddMinutes(slotMinutes);
            }
            return -1;
        }

Mal schauen was ihr dazu sagt?

16.807 Beiträge seit 2008
vor 2 Jahren

Logik kannst ja selbst prüfen 🙂
Zeiten generell: [FAQ] DateTime vs. DateTimeOffset und der Umgang mit Zeiten in .NET
Methode würde ich mit Try-Pattern lösen, also

bool TryGetTimeSlot(DateTimeOffset reference, TimeSpan duration, out TimeSpan slot)
4.931 Beiträge seit 2008
vor 2 Jahren

Ich meinte eigentlich nur


return (60 * time.Hour + time.Minute) / slotMinutes; // evtl. noch aufrunden

6.911 Beiträge seit 2009
vor 2 Jahren

Hallo,

// evtl. noch aufrunden

Dazu gibt es bei der Ganzzahldivision einen netten Trick:


return (60 * time.Hour + time.Minute + (slotMinutes - 1)) / slotMinutes;

Spart die Konvertierung zu double und zurück, die bei Math.Round nötig wäre.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

4.931 Beiträge seit 2008
vor 2 Jahren

Hallo gfoidl,

mir ist das klar, aber ich weiß nicht, ob das überhaupt die gewünschte Berechnung ist (evtl. auch einfach +1, falls 0:00h schon als 1. Slot zählt).

6.911 Beiträge seit 2009
vor 2 Jahren

Hallo Th69,

mir ist / war ziemlich klar dass du diesen "Trick" kennst, daher hab ich auch nicht dich angesprochen, sondern alle anderen die das nicht kannten.
Das erspart nämlich das Runden via Um- und Zurückwandeln zu double od. einen if-Block. Der Trick ist eher als ganz allgemeiner Tipp gemeint.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"