Метод вычитания временного интервала возвращает отрицательный временной интервал

StackOverflow https://stackoverflow.com/questions/1876237

  •  18-09-2019
  •  | 
  •  

Вопрос

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

Dim r As TimeSpan
Dim tsStart As TimeSpan
Dim tsEnd As TimeSpan

'tsStard is 12:27:30 (pm) this happened first
'tsEnd is 00:10:25 (am) then this happened later

'You can't store 24:10:25 in the column type Time(7)

r = tsEnd.Subtract(tsStart)

'the r = -12:17:05

Есть ли какой-либо метод TimeSpan, чтобы сделать это правильно?Спасибо.

Это было полезно?

Решение

Если вы знаете, что tsEnd всегда представляет более поздний момент времени, чем tsStart но ваша база данных не хранит даты, вы можете решить это, добавив 24 часа к концу, когда конец меньше начала (простите за синтаксис C #):

if (tsEnd < tsStart) {
    r = tsEnd.Add(new TimeSpan(24, 0, 0)).Subtract(tsStart);
} else {
    r = tsEnd.Subtract(tsStart);
}

Как отметил jball в комментариях, это предполагает, что tsEnd никогда не опаздывает более чем на один день, хотя у нас нет способа определить иное.

Другие советы

Если вы используете метод Duration() для TimeSpan, это гарантирует, что ваш результат будет положительным, независимо от того, в каком порядке вы выполняете вычитание.

Например:

Dim r As TimeSpan
Dim tsStart As TimeSpan
Dim tsEnd As TimeSpan

'tsStart is 12:27:30 
'tsEnd is 00:10:25 

r = tsEnd.Subtract(tsStart).Duration()
'r = 12:17:05

Значение tsEnd меньше, чем значение tsStart, так что r = tsEnd.Subtract(tsStart) должно привести к отрицательному числу.Возможно, вы хотите вычесть tsEnd из tsStart r = tsStart.Subtract(tsEnd), или ваши переменные устанавливаются в обратное положение по сравнению с тем, какими они должны быть?

В зависимости от вашей ситуации вы можете захотеть позвонить r = r.Duration(), который возвращает абсолютное значение r.

Если вы беспокоитесь о переносе дней, вам понадобится дата - невозможно узнать, сколько дней прошло, только из компонента time.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top