2013-03-28 7 views
2

Привет всем У меня есть интересная ситуация.C# вычесть время (часы минуты)

Я хочу, чтобы подсчитать, сколько часов (в минутах) от 20:00 до 01:00, но я не знаю как, потому что я сделал это:

pabaigosLaikoLaukelis = 01:00; 
pradziosLaikoLaukelis = 20:00; 
TimeSpan dt = Convert.ToDateTime(pabaigosLaikoLaukelis)- Convert.ToDateTime(pradziosLaikoLaukelis); 
int minutes = (int)dt.TotalMinutes; 

И Я получаю результат -> -1140 минут, но мне нужно, чтобы ответ был всего 5 часов с 20:00 до 01:00.

Я знаю, что это довольно просто, но я понятия не имею, как это сделать.

+1

Вы пересекающих границу даты (1 утра сегодня - 8 вечера сегодня). Если вы не сообщите эту информацию, C# никогда не узнает об этом. –

+0

Результат правильный. Вы должны убедиться, что время с завтрашнего дня действительно соответствует правильной дате. Попробуйте добавить один день к результату первого Convert.ToDateTime. –

+1

И используйте 'TotalHours' вместо' TotalMinutes' –

ответ

2

вы можете сделать что-то подобное

 //Datetime(Year,month,day,hour,min,sec) 
     DateTime date1 = new DateTime(2012, 1, 1, 20, 0, 0); 
     DateTime date2 = new DateTime(2012, 1, 2, 1, 0, 0); 
     string minutes = (date2.Subtract(date1).TotalMinutes).ToString(); 

Протестировано и работает 300 минут (5 часов)

0

Вам необходимо указать день, вы subracting (сегодня 1:00 AM) - (Сегодня 8:00 PM)

Я думаю, что вам нужно subract (Tommorrow 1:00 AM) - (сегодня 8 : 00 PM)

3

Используйте строки полной даты времени, которые содержат дневную часть, чтобы показать, что 01:00 АМ один день позже 20:00 - как следующее:

int minutes = Convert.ToDateTime("01/02/2012 01:00").Substract(Convert.ToDateTime("01/01/2012 20:00")).TotalMinutes; 
0

Вам нужно добавить в день до первого TimeSpan и используйте TotalHours.

var pabaigosLaikoLaukelis = "01:00"; 
var pradziosLaikoLaukelis = "20:00"; 
var oneDayTimeSpan = new TimeSpan(1, 0, 0, 0); 
TimeSpan dt = TimeSpan.Parse(pabaigosLaikoLaukelis).Add(oneDayTimeSpan) - TimeSpan.Parse(pradziosLaikoLaukelis); 
int minutes = (int)dt.TotalHours; // 5 hours 

Использование ассоциативные операции:

var pabaigosLaikoLaukelis = "21:00"; 
var pradziosLaikoLaukelis = "20:00"; 
var leftHours = (int)TimeSpan.Parse(pabaigosLaikoLaukelis).TotalHours; 
var rightHours = (int)TimeSpan.Parse(pradziosLaikoLaukelis).TotalHours; 
// Now we do a Modulus operation which will assure 
// 23 > hours > 0 
// Make sure to check that leftHours != 0 or rightHours != 0 
int hours = (Math.Abs(leftHours * rightHours) + leftHours) % rightHours; //Modulus 
var hoursTimeSpan = TimeSpan.FromHours(hours); 
+0

Если время окончания 21:00, это даст ему 25 часов вместо 1. –

+0

Ну да, потому что временные операции не являются ассоциативными. Было бы лучше просто использовать математику в этот момент. – Romoku

+0

@caerolus Я привел пример. – Romoku

0

Будьте осторожны с добавлением одного дня к EndTime, потому что тогда разница между 20:00 и 22:00 будет 26 часов вместо 2!

Просто проверить, является ли разница положительна (в тот же день) или отрицательный (на следующий день)

string pabaigosLaikoLaukelis = "01:00"; 
string pradziosLaikoLaukelis = "20:00"; 
// This should be 5 hours 
TimeSpan dt = Convert.ToDateTime(pabaigosLaikoLaukelis) - Convert.ToDateTime(pradziosLaikoLaukelis); 
int hours = (int)dt.TotalHours; 
hours = hours < 0 ? 24 + hours : hours; 
// This should be 19 hours 
dt = Convert.ToDateTime(pradziosLaikoLaukelis) - Convert.ToDateTime(pabaigosLaikoLaukelis); 
hours = (int)dt.TotalHours; 
hours = hours < 0 ? 24 + hours : hours; 
0

Немного подготовки двух строковых переменных требуется, прежде чем пытаться вычисления данных

string pabaigosLaikoLaukelis = "01:00"; 
string pradziosLaikoLaukelis = "20:00"; 
pabaigosLaikoLaukelis = DateTime.Today.ToString("dd/MM/yyyy") + " " + pabaigosLaikoLaukelis; 
pradziosLaikoLaukelis = DateTime.Today.AddDays(-1).ToString("dd/MM/yyyy") + " " + pradziosLaikoLaukelis; 

TimeSpan dt = Convert.ToDateTime(pabaigosLaikoLaukelis) - Convert.ToDateTime(pradziosLaikoLaukelis); 
Console.WriteLine("{0:D2}:{1:D2}", dt.Hours, dt.Minutes); 
0

Как об этом:

pabaigosLaikoLaukelis = 01:00; 
pradziosLaikoLaukelis = 20:00; 
TimeSpan startTime = Convert.ToDateTime(pradziosLaikoLaukelis).TimeOfDay; 
TimeSpan endTime = Convert.ToDateTime(pabaigosLaikoLaukelis).TimeOfDay; 
TimeSpan diff = endTime > startTime ? endTime - startTime : endTime - startTime + TimeSpan.FromDays(1); 
int minutes = (int)diff.TotalMinutes; 
Смежные вопросы