Jak uzyskać różnicę czasu między dwoma obiektami DateTime przy użyciu C #?


159

Jak uzyskać różnicę czasu między dwoma DateTimeobiektami przy użyciu języka C #?

Odpowiedzi:


227

Poniższy przykład ilustruje, jak to zrobić:

DateTime a = new DateTime(2010, 05, 12, 13, 15, 00);
DateTime b = new DateTime(2010, 05, 12, 13, 45, 00);
Console.WriteLine(b.Subtract(a).TotalMinutes);

Po wykonaniu wypisuje "30", ponieważ istnieje 30-minutowa różnica między datą / godziną.

Wynikiem DateTime.Subtract(DateTime x)jest obiekt TimeSpan, który daje inne przydatne właściwości.


5
Aby wyświetlić różnicę, coś jak to zrobić: Console.WriteLine((a - b).ToString(@"hh\:mm\:ss")). Zobacz: Niestandardowy format MSDN TimeSpan
ishmael

To zadziałało dla mnie. Chciałem tylko określić, ile sekund zajmie klientowi wykonanie połączenia REST i otrzymanie odpowiedzi.
Ziggler

1
Zwróć uwagę na użycie TotalMinutes! (nie Minutes)
Shahar Shokrani

64

Chcesz TimeSpanstruktury:

TimeSpan diff = dateTime1 - dateTime2;

Obiekt TimeSpan reprezentuje przedział czasu (czas trwania lub czas, który upłynął), który jest mierzony jako dodatnia lub ujemna liczba dni, godzin, minut, sekund i ułamków sekundy. Struktury TimeSpan można również użyć do reprezentowania pory dnia, ale tylko wtedy, gdy czas nie jest powiązany z określoną datą.

Istnieją różne metody odzyskiwania dni, godzin, minut, sekund i milisekund z tej struktury.

Jeśli interesuje Cię tylko różnica, to:

TimeSpan diff = Math.Abs(dateTime1 - dateTime2);

da ci dodatnią różnicę między czasami niezależnie od zamówienia.

Jeśli masz właśnie składnik czasu, ale czasy mogą być podzielone o północy, musisz dodać 24 godziny do zakresu, aby uzyskać rzeczywistą różnicę:

TimeSpan diff = dateTime1 - dateTime2;
if (diff < 0)
{
    diff = diff + TimeSpan.FromDays(1);
}

Cześć, jeśli datetime2 to 09:00, a dateTime1 to 18:00, to diff to 09Hours 00 min. to jakie jest równanie dla datetime2 to 21:00, a dateTime1 to 03:00, to różnica jest ujemna i błędna. Jak to rozwiązać?
Pranesh Janarthanan

@Pranesh - jeśli obiekty zawierają datę, nie powinno być problemu. Jeśli nie zawierają czasu, weź bezwzględną różnicę lub dodaj 24 godziny do przedziału czasu, aby uzyskać dodatnią różnicę. To, które jest poprawne, zależy od twojej aplikacji.
ChrisF

Tak, już usunąłem te komentarze! czy możesz pokazać mi przykład kodu do wyjaśnienia twojego?
Pranesh Janarthanan

30

Potrzebne jest użycie metody Subtract klas DateTime , która zwraca TimeSpan .

var dateOne = DateTime.Now;
var dateTwo = DateTime.Now.AddMinutes(-5);
var diff = dateTwo.Subtract(dateOne);
var res = String.Format("{0}:{1}:{2}", diff.Hours,diff.Minutes,diff.Seconds));

10

Sposób, w jaki zwykle to robię, to odejmowanie dwóch DateTime, a to daje mi TimeSpan, który pokaże mi różnicę.

Oto przykład:

DateTime start = DateTime.Now;
// Do some work
TimeSpan timeDiff = DateTime.Now - start;
timeDiff.TotalMilliseconds;

4

JEŚLI obie są wartościami daty i czasu UTC, które możesz zrobić TimeSpan diff = dateTime1 - dateTime2;

W przeciwnym razie szansa na uzyskanie poprawnej odpowiedzi w każdym możliwym przypadku wynosi zero.


3
 var startDate = new DateTime(2007, 3, 24);

 var endDate = new DateTime(2009, 6, 26);

 var dateDiff = endDate.Subtract(startDate);

 var date = string.Format("{0} years {1} months {2} days", (int)dateDiff.TotalDays / 365, 
 (int)(dateDiff.TotalDays % 365) / 30, (int)(dateDiff.TotalDays % 365) / 30);

 Console.WriteLine(date);

2

Musisz użyć TimeSpan . Oto przykładowy kod:

TimeSpan sincelast = TimeSpan.FromTicks(DateTime.Now.Ticks - LastUpdate.Ticks);

2
Albo po prostuTimeSpan sincelast = DateTime.Now - LastUpdate;
Ben M.

2
private void button1_Click(object sender, EventArgs e)
{
    TimeSpan timespan;
    timespan = dateTimePicker2.Value - dateTimePicker1.Value;
    int timeDifference = timespan.Days;
    MessageBox.Show(timeDifference.ToString());
}

2

Możesz użyć w następujący sposób, aby uzyskać różnicę między dwoma obiektami daty i godziny. Załóżmy, że istnieją obiekty DateTime dt1 i dt2, a następnie kod.

TimeSpan diff = dt2.Subtract(dt1);
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.