Cum se incrementează timpul în minute (Programare, C#, Datetime)

Mati Silver a intrebat.

Trebuie să fac un algoritm pentru a incrementa timpul în termen de minute. Am făcut-o manual și funcționează bine. Dar, dacă data de început este acum 1, 2 ani, și trebuie să măresc la fiecare 10 minute, durează prea mult timp. iată codul pe care l-am făcut, și după cum am spus, funcționează bine, dar durează prea mult dacă data de început și de sfârșit sunt departe.

int inc = 40;
DateTime startTime = DateTime.Today.AddHours(8).AddMinutes(50);//new DateTime(2013,9,6,18,40,0,DateTimeKind.Local);//DateTime.Today.AddHours(10).AddMinutes(50);
DateTime endTime = DateTime.Today.AddHours(18).AddMinutes(35);//DateTime.Now;
List<DateTime> timeList = new List<DateTime>();
//while (startTime < DateTime.Now.AddMinutes(inc))
while (startTime < endTime.AddMinutes(inc))
{
    timeList.Add(startTime);
    startTime = startTime.AddMinutes(inc);
}

Data de început: 12/9/2019 8:50Data de sfârșit: 12/9/2019 18:35

Creșteți la fiecare 40 de minute.

Așadar, rezultatul este:

12/09/2016 8:50:00
12/09/2016 9:30:00
12/09/2016 10:10:00
12/09/2016 10:50:00
12/09/2016 11:30:00
12/09/2016 12:10:00
12/09/2016 12:50:00
12/09/2016 13:30:00
12/09/2016 14:10:00
12/09/2016 14:50:00
12/09/2016 15:30:00
12/09/2016 16:10:00
12/09/2016 16:50:00
12/09/2016 17:30:00
12/09/2016 18:10:00
12/09/2016 18:50:00

Am nevoie doar de ultimele 2 linii:

12/09/2016 18:10:00
12/09/2016 18:50:00

Mulțumesc

Comentarii

  • Vrei să spui că ai nevoie de „endTime – 20 minute”, și „endTime – 10 minute”? –  > Por Gus.
  • Scuze? Nu înțeleg ce ați spus. –  > Por Mati Silver.
  • Sau ceva asemănător cu întrebarea lui Gus, dar ținând cont de faptul că diferența dintre început și sfârșit s-ar putea să nu fie exact divizibilă cu incrementul tău? –  > Por Ian din Oz.
  • Cred că amândoi suntem puțin nesiguri cu privire la cerințele tale exacte. De ce doar ultimele două rânduri? Este vorba de 10 secunde sau de creșteri de 40 de secunde? –  > Por Ian din Oz.
  • Nu întotdeauna va fi exact divizibil… incrementul (minute) ar putea fi diferit. De asemenea, data de început și de sfârșit. –  > Por Mati Silver.
3 răspunsuri
Noapte bună Nerd Pride

Calculează doar minutele ultimelor două intervale pentru a evita bucla:

var timeSpan = endTime - startTime;
var intervals = (int)timeSpan.TotalMinutes / inc;

// In case the endTime is aligned with the interval:
if ((int)timeSpan.TotalMinutes % inc == 0)
    intervals--;

startTime = startTime.AddMinutes(intervals * inc);
timeList.Add(startTime);
startTime = startTime.AddMinutes(inc);
timeList.Add(startTime);

Iată o versiune ceva mai elegantă:

var intervals = Math.Ceiling(timeSpan.TotalMinutes / inc);  

startTime = startTime.AddMinutes((intervals - 1) * inc);
timeList.Add(startTime);
startTime = startTime.AddMinutes(inc);
timeList.Add(startTime);

Aici este un exemplu de lucru: https://dotnetfiddle.net/M1Z7Bn

Încercați diferite valori (de ex. 35, , 50, , și 55) pentru AddMinutes() la:

var end = DateTime.Today.AddHours(18).AddMinutes(35);

Aron
public static IEnumerable<DateTime> CreateIntervals(this DateTime start, TimeSpan interval)
{
    while(true)
    {
        yield return start;
        start = start + interval;
    }
}

var timeList = startTime.CreateInterval(interval).Take(40).ToList();

ZOXIS

Din moment ce minutele tale sunt fixe pentru iterația buclei și nu faci nimic sofisticat cu ieșirea. Ați încercat să comparați performanța cu cea nativă lungă prin conversia în timestamp de dragul acestei bucle și să convertiți doar în zbor la o dată în cazul în care trebuie să utilizați data (datele). Vă sugerez, de asemenea, ca o alternativă și pentru o performanță mai bună atunci când lucrați cu date, să utilizați biblioteca Joda.

Iată cele 2 cenți ai mei:

    long endTime = System.currentTimeMillis();

    // Two years ago
    long startTime = Math.subtractExact(System.currentTimeMillis(), 31536000000L);

    long instanceTime = startTime;

    ArrayList<Long> dateList = new ArrayList<>();

    while(instanceTime < endTime){
        instanceTime += 60000L; // Ten minute increment
        dateList.add(instanceTime);
    }

Tags:,