У меня есть ряд раз, которые приходят ко мне как строки из веб-службы. Время указывается в формате ЧЧ: ММ: СС: 000 (3 милисекундные цифры). Мне нужно сравнить два раза, чтобы определить, является ли один более чем в два раза длиннее другого:
if ( timeA / timeB > 2 )
Какой самый простой способ работы со строками времени?
Если бы я писал на Python, это было бы ответом на мой вопрос:
Разница между двумя временными интервалами?
(кроме оператора, который мне нужен, это деление, а не вычитание)
Редактировать: Что я действительно ищу, так это способ получить соотношение времени A к времени B, которое требует деления, а не вычитания. К сожалению, структура DateTime не имеет оператора деления. Обновлен заголовок вопроса и текст, чтобы отразить это.
Решение:
Основываясь на ответе, который я выбрал ниже, который был самым простым из всех предложенных методов, вот рабочее решение:
DateTime timeA;
DateTime timeB;
DateTime.TryParse(webServiceTimeString_A, out timeA);
DateTime.TryParse(webServiceTimeString_B, out timeB);
// TimeA is more than twice the duration of TimeB.
if ( (double)timeA.TimeOfDay.Ticks / (double)timeB.TimeOfDay.Ticks > 2.0f )
{
// Do stuff.
}
else
{
// Do different stuff.
}
JavaScript:
В последнее время эта функция также требовалась в JavaScript для вызова AJAX, поэтому мне все-таки пришлось написать функцию преобразования (только не в C #). В случае, если это необходимо:
if (_timeInSeconds(timeA) / _timeInSeconds(timeB) > 2) {
// Do stuff.
}
// Convert HH:MM:SS:000 string to a number of seconds so we can do math on it.
function _timeInSeconds(stringTime) {
var timeArray = stringTime.split(":");
var timeInSeconds = 0;
//HH
timeInSeconds += (parseInt(timeArray[0], 10) * 3600);
//MM
timeInSeconds += (parseInt(timeArray[1], 10) * 60);
//SS
timeInSeconds += (parseInt(timeArray[2], 10));
//Milliseconds
timeInSeconds += (parseInt(timeArray[3], 10) / 1000);
return timeInSeconds;
}
Слово мудрым: обязательно укажите второй аргумент parseInt ...
parseInt(string, 10)
... чтобы указать, что строка является числом Base-10. В противном случае, если строка начинается с 0
(обычно в форматах ЧЧ: ММ: СС), JavaScript решает, что это число Base-8. Это приводит к тому, что строки "08"
и "09"
преобразуются в десятичное целое число 0
(поскольку 8 и 9 не существуют в Base-8), и вычисления сбрасываются.