Як отримати різницю у часі між двома об'єктами DateTime за допомогою C #?


159

Як отримати різницю у часі між двома DateTimeоб’єктами за допомогою C #?

Відповіді:


227

Наступний приклад демонструє, як це зробити:

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);

При виконанні цього відбитки "30", оскільки між датою / часом існує 30-хвилинна різниця.

Результатом DateTime.Subtract(DateTime x)є об’єкт TimeSpan, який дає інші корисні властивості.


5
Щоб відобразити різницю, зробити що - щось на зразок цього: Console.WriteLine((a - b).ToString(@"hh\:mm\:ss")). Дивіться: MSDN Custom TimeSpan Format
ishmael

Це працювало для мене. Я просто хотів, скільки секунд потрібно, щоб клієнт здійснив REST-дзвінок і отримав відповідь.
Ziggler

1
Зверніть увагу на використання TotalMinutes! (не Minutes)
Шахар Шокрані

64

Ви хочете TimeSpanструктуру:

TimeSpan diff = dateTime1 - dateTime2;

Об'єкт TimeSpan являє собою часовий інтервал (тривалість часу або минулий час), який вимірюється як додатне або негативне число днів, годин, хвилин, секунд і частки секунди. Структуру TimeSpan також можна використовувати для відображення часу доби, але лише якщо час не пов'язаний з конкретною датою.

Існують різні методи повернення днів, годин, хвилин, секунд і мілісекунд від цієї структури.

Якщо вас просто цікавить різниця, тоді:

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

дасть вам позитивну різницю між часом, незалежно від порядку.

Якщо ви тільки що отримали часовий компонент, але час можна розділити на півночі, тоді вам потрібно додати 24 години до проміжку, щоб отримати фактичну різницю:

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

привіт, якщо datetime2 - 09:00, а dateTime1 - 18:00, то різниця - 09:00 00 хв. то рівняння для datetime2 - 21:00, а датаTime1 - 03:00, тоді різниця від’ємна і неправильна. Як це вирішити?
Pranesh Janarthanan

@Pranesh - якщо об’єкти містять дату, то проблеми не повинно бути. Якщо вони не містять часу, то або візьміть абсолютну різницю, або додайте 24 години в проміжок часу, щоб дати позитивну різницю. Що правильно, залежатиме від вашої заявки.
ChrisF

Так, я вже видалив цей коментар! ви можете показати мені приклад коду для пояснення ур?
Pranesh Janarthanan

30

Вам потрібно використовувати метод Віднімання класів DateTime , який повертає 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

Як я зазвичай це роблю, віднімаю два DateTime, і це отримує мені TimeSpan, який підкаже мені різницю.

Ось приклад:

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

4

ЯКЩО вони обидва значення дати та часу UTC, які ви можете зробити TimeSpan diff = dateTime1 - dateTime2;

Інакше шанс отримати правильну відповідь у кожному можливому випадку дорівнює нулю.


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

Вам потрібно використовувати TimeSpan . Ось приклад коду:

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

2
Або простоTimeSpan sincelast = DateTime.Now - LastUpdate;
Бен М

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

Ви можете використовувати наступний спосіб, щоб досягти різниці між двома об'єктами дати. Припустимо, є об'єкти DateTime dt1 і dt2, а потім код.

TimeSpan diff = dt2.Subtract(dt1);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.