Laden...

DateTime Verrechnen und Zeitspanne auf Tage aufrunden

Erstellt von deluxe13 vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.316 Views
D
deluxe13 Themenstarter:in
32 Beiträge seit 2018
vor 4 Jahren
DateTime Verrechnen und Zeitspanne auf Tage aufrunden

Hallo ihr lieben, ich möchte eine Differenz zwischen zwei zeiten haben, was soweit kein problem ist


            string dd = dateEdit1.DateTime.ToString("dd.MM.yyyy") + " " + txtVerilisSaat.Text + ":" + txtVerilisDakika.Text;
            DateTime dt1 = DateTime.ParseExact(dd, "dd.MM.yyyy HH:mm", System.Globalization.CultureInfo.InvariantCulture);

            string d2 = dateEdit2.DateTime.ToString("dd.MM.yyyy") + " " + txtVerilisSaat.Text + ":" + txtVerilisDakika.Text;
            DateTime dt2 = DateTime.ParseExact(d2, "dd.MM.yyyy HH:mm", System.Globalization.CultureInfo.InstalledUICulture);

            TimeSpan diff = dt2 - dt1;

nun möchte ich aber die Zeitspann " diff " aufrunden. Also wenn zb. 1 Tag und 1 Stunde das ergebniss ist möchte ich es auf 2 Tage aufrunden. Also Sobald es eine minute mehr als ein Tag ist ( die differenz) möchte ich das dieser es auf einen vollen Tag Aufrunded.
Hat jemand vielleicht eine idee?

6.911 Beiträge seit 2009
vor 4 Jahren

Hallo deluxe13,

schau dir TimeSpan.TotalMinutes dazu an. Den Rest schaffst du dann schon 😉

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!"

D
deluxe13 Themenstarter:in
32 Beiträge seit 2018
vor 4 Jahren

Mit den Minuten hab ich ja erstmal wenig zu tun, ich möchte auf Tage aufrunden.

lbltotaldays.Text = ((int)Math.Round(totaldays.TotalDays, MidpointRounding.AwayFromZero)).ToString();

das wäre ja theoretisch möglich.. Nur rundet es dann halt ab .05 aufwärts auf. Ich möchte aber sobald eine Sekunde drüber ist auf einen Kompleten tag aufrunden 😄

gibts da noch was anderes außer midpointRounding, glaube etwas was immer aufrunden wäre dann schon meine lösung.

Wenn normale INT wäre würde man es ja mit Math.Ceiling-Methode recht einfach lösen können aber mit DateTime ... mhh

Hinweis von gfoidl vor 4 Jahren

Bitte keine Fullquotes. Steht ja eh darüber 😉

6.911 Beiträge seit 2009
vor 4 Jahren

Hallo deluxe13,

willst du so etwas?


using System;
using System.Collections.Generic;
using NUnit.Framework;

namespace Tests
{
    [TestFixture]
    public class Tests
    {
        [Test, TestCaseSource(nameof(Correct_rounding_TestCases))]
        public TimeSpan Correct_rounding(TimeSpan input)
        {
            return input.RoundToWholeDays();
        }

        private static IEnumerable<TestCaseData> Correct_rounding_TestCases()
        {
            yield return new TestCaseData(new TimeSpan(1, 0, 0, 0)).Returns(new TimeSpan(1, 0, 0, 0));
            yield return new TestCaseData(new TimeSpan(1, 0, 0, 1)).Returns(new TimeSpan(2, 0, 0, 0));
            yield return new TestCaseData(new TimeSpan(1, 0, 1, 0)).Returns(new TimeSpan(2, 0, 0, 0));
            yield return new TestCaseData(new TimeSpan(1, 1, 0, 0)).Returns(new TimeSpan(2, 0, 0, 0));
        }
    }

    public static class Extensions
    {
        public static TimeSpan RoundToWholeDays(this TimeSpan timeSpan)
        {
            int days = timeSpan.Days;

            return timeSpan.TotalDays == days
                ? timeSpan
                : new TimeSpan(days + 1, 0, 0, 0);
        }
    }
}

Hier hab TotalDays verwendet.

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!"

D
deluxe13 Themenstarter:in
32 Beiträge seit 2018
vor 4 Jahren

Das Soll wirklich aufrunden ?

Ich habe Datetime 1 und 2

zb.

01.01.2010 15:00
02.01.2010 15:10

soll das Erbeniss " 2 " liefern.

01.01.2001 15:00
01.01.2001 16:00

Das Ergebniss "1" .

Mit timespan.Days holt er ja nur die Tage.. Wie soll hier das Aufrunden möglich sein.
blicke gerade garnicht mehr durch, gibts diesen code nicht vereinfacht für Amateure 😃

-- Habs jetzt mal anders gelöst. Ich vergleiche die Stunden und Minuten und wenn größer oder kleiner packe ich einfach eine eins drauf 😃

5.658 Beiträge seit 2006
vor 4 Jahren

Schau dir doch mal die Dokumentation zu TimeSpan.TotalDays und probier den Code von gfoidl aus.

The TotalDays property represents whole and fractional days, whereas the Days property represents whole days.

Weeks of programming can save you hours of planning