Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Timeslot bestimmen
Grimmbizkit
myCSharp.de - Member



Dabei seit:
Beiträge: 313
Herkunft: Niederrhein

Themenstarter:

Timeslot bestimmen

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4188

beantworten | zitieren | melden

Das wirst du doch selber hinbekommen, aus den Stunden und Minuten den Wert zu ermitteln...
private Nachricht | Beiträge des Benutzers
Grimmbizkit
myCSharp.de - Member



Dabei seit:
Beiträge: 313
Herkunft: Niederrhein

Themenstarter:

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16204

beantworten | zitieren | melden

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)
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4188

beantworten | zitieren | melden

Ich meinte eigentlich nur


return (60 * time.Hour + time.Minute) / slotMinutes; // evtl. noch aufrunden
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 7572
Herkunft: Waidring

beantworten | zitieren | melden

Hallo,
Zitat
// 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!"
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4188

beantworten | zitieren | melden

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).
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 7572
Herkunft: Waidring

beantworten | zitieren | melden

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!"
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4188

beantworten | zitieren | melden

Ah, OK.
private Nachricht | Beiträge des Benutzers