Получение промежутка времени между двумя моментами в C #?

У меня есть два текстовых поля. Один для часов во времени и один для часов. Время будет записано в следующем формате:

Hours:Minutes

Допустим, я пришел в 7:00 и ушел в 14:00.

С моим текущим кодом разница составляет 2 часа, но она должна составлять 7 часов. Как бы я сделал это на C #. Я собирался перейти на 24-часовой формат, позволив пользователю выбрать AM или PM, но запутался.

Итак, как я могу рассчитать разницу в часах между двумя временами?

Я пробовал это, но когда я подключал числа, у меня было 2 часа, а не 7.

DateTime startTime = Convert.ToDateTime(textBox1.Text);
DateTime endtime = Convert.ToDateTime(textBox2.Text);

TimeSpan duration = startTime - endtime;

person Hunter Mitchell    schedule 20.09.2012    source источник
comment
Каково точное содержание ваших текстовых полей?   -  person Zdeslav Vojkovic    schedule 21.09.2012
comment
Вы проверяете, правильно ли разобрано время? То есть вы проверили значения startTime и endTime?   -  person John    schedule 21.09.2012
comment
ну, пользователи должны вводить ... 7:00 (в любое время) в текстовые поля   -  person Hunter Mitchell    schedule 21.09.2012
comment
Я не понимаю, откуда вы знаете, 2:00 утра или вечера. Кроме того, какую культуру вы используете (какой регион)? Кстати, это должно быть duration = end - start, а не наоборот   -  person Zdeslav Vojkovic    schedule 21.09.2012
comment
Используя 7:00; 7:00 утра ; 7:00 утра ; 7:00 УТРА ; 7:00 утра все работает нормально. Мне любопытно узнать, что такое textBox1.Text, поскольку я не могу дублировать вашу проблему.   -  person user1424311    schedule 21.09.2012
comment
есть ли шанс, что одно из ваших текстовых полей по умолчанию установлено на 00:00 и что вы либо используете неправильный в коде, либо каким-то образом перезаписываете значение (например, во время проверки)? Это объяснило бы 02:00 - 00:00 => 2 h   -  person Zdeslav Vojkovic    schedule 21.09.2012


Ответы (4)


string startTime = "7:00 AM";
string endTime = "2:00 PM";

TimeSpan duration = DateTime.Parse(endTime).Subtract(DateTime.Parse(startTime));

Console.WriteLine(duration);
Console.ReadKey();

Будет выводиться: 07:00:00.

Это также работает, если пользователь вводит военное время:

string startTime = "7:00";
string endTime = "14:00";

TimeSpan duration = DateTime.Parse(endTime).Subtract(DateTime.Parse(startTime));

Console.WriteLine(duration);
Console.ReadKey();

Выходы: 07:00:00.

Чтобы изменить формат: duration.ToString(@"hh\:mm")

Дополнительная информация: http://msdn.microsoft.com/en-us/library/ee372287.aspx

Приложение:

На протяжении многих лет меня несколько беспокоило, что это самый популярный ответ, который я когда-либо давал; исходный ответ на самом деле никогда не объяснял, почему код OP не работал, несмотря на то, что он является совершенно действительным. Единственная причина, по которой он получает так много голосов, заключается в том, что сообщение появляется в Google, когда люди ищут комбинацию терминов «C #», «промежуток времени» и «между».

person Kittoes0124    schedule 20.09.2012
comment
TimeSpan duration = endtime - startTime; тоже работает в этом примере. - person user1424311; 21.09.2012
comment
@EliteGamer См. Эту документацию по строкам формата времени. - person Dan J; 21.09.2012
comment
@EliteGamer, как это отвечает на ваш вопрос? - person Zdeslav Vojkovic; 21.09.2012
comment
Он до сих пор не объясняет, как результат был 2 часа, поскольку код по сути такой же, как и у него (с измененным порядком endTime и startTime) - person Zdeslav Vojkovic; 21.09.2012
comment
Он не работает со следующей строкой case startTime = 8:00 PM; строка endTime = 12:00 PM; - person Abdulsalam Elsharif; 19.01.2019
comment
@AbdulsalamElsharif Чего вы ожидаете в результате? Временное значение 12:00 (12:00 PM) действительно на восемь часов отстает от значения времени 20:00 (8:00 PM) ... - person Kittoes0124; 19.01.2019
comment
@AbdulsalamElsharif Неважно, я полагаю, он просто напутал что-то во время тестирования, чтобы получить такой фиктивный результат. Есть и другие объяснения, связанные с часовыми поясами, которые - возможно - объясняют, но я никогда не спекулировал на таких вещах ... - person Kittoes0124; 19.01.2019

Вы можете использовать конструктор TimeSpan, который требует много времени для Ticks:

 TimeSpan duration = new TimeSpan(endtime.Ticks - startTime.Ticks);
person Tim Lehner    schedule 20.09.2012

Два момента:

  1. Проверьте свои входы. Я не могу представить себе ситуацию, когда вы получите 2 часа, если вычесть значения времени, о которых вы говорите. Если я сделаю это:

        DateTime startTime = Convert.ToDateTime("7:00 AM");
        DateTime endtime = Convert.ToDateTime("2:00 PM");
        TimeSpan duration = startTime - endtime;
    

    ... Я получаю -07:00:00 в результате. И даже если я забуду указать значение AM / PM:

        DateTime startTime = Convert.ToDateTime("7:00");
        DateTime endtime = Convert.ToDateTime("2:00");
        TimeSpan duration = startTime - endtime;
    

    ... Я получаю 05:00:00. Таким образом, либо ваши входные данные не содержат перечисленных вами значений, либо вы находитесь в машинной среде, где они начинают анализироваться неожиданным образом. Или вы на самом деле не получаете тех результатов, о которых сообщаете.

  2. Чтобы найти разницу между временем начала и окончания, вам нужно сделать endTime - startTime, а не наоборот.

person StriplingWarrior    schedule 20.09.2012

Другой способ (более длинный) В VB.net [скажем, начало в 23:00 и окончание в 07:00 на следующий день]

Если tsStart> tsFinish Тогда

                            ' Take Hours difference and adjust accordingly
                            tsDifference = New TimeSpan((24 - tsStart.Hours) + tsFinish.Hours, 0, 0)

                            ' Add Minutes to Difference
                            tsDifference = tsDifference.Add(New TimeSpan(0, Math.Abs(tsStart.Minutes - tsFinish.Minutes), 0))


                            ' Add Seonds to Difference
                            tsDifference = tsDifference.Add(New TimeSpan(0, 0, Math.Abs(tsStart.Seconds - tsFinish.Seconds)))
person SMA    schedule 25.03.2014