Я пишу простую обертку вокруг структуры Win32 FILETIME. boost::datetime
имеет большую часть того, что я хочу, кроме мне нужен любой тип даты, который я заканчиваю тем, что использовал для интерполяции с Windows APIs без проблем.
С этой целью я решил записать свои собственные вещи для того, чтобы сделать это - большинство операций не все, что это усложнило. Я реализую TimeSpan - как тип в этой точке, но я не уверен, как я реализовал бы FileTimeToSystemTime. Я мог просто использовать встроенную функцию FileTimeToSystemTime системы, кроме FileTimeToSystemTime не может обработать отрицательные даты - я должен смочь представить что-то как "-12 секунд".
Как что-то вроде этого должно быть реализовано?
Billy3
Типы данных Windows SYSTEMTIME и FILETIME предназначены для представления определенной даты и времени. Они не совсем подходят для отображения разницы во времени. Разницу во времени лучше использовать в виде простого целого числа, представляющего количество между двумя SYSTEMTIME или FILETIME. может быть секунд или что-то меньшее, если вам нужно больше точности.
Если вам нужно показать разницу для пользователей, для вычисления компонентов можно использовать простое деление и модуль.
std::string PrintTimeDiff(int nSecDiff)
{
std::ostringstream os;
if (nSecDiff<0)
{
os << "-";
nSecDiff= -nSecDiff;
}
int nSeconds = nSecDiff % (24*60*60);
nSecDiff /= 60;
int nMinutes = nSecDiff % (24*60)
nSecDiff /= 60;
int nHours = nSecDiff % 24;
int nDays = nSecDiff / 24;
os << nDays << " Days " << nHours << ":" << nMinutes << ":" << nSeconds;
return os .str();
}
Предполагая, что у вас нет проблем со структурой, имеющей все беззнаковые компоненты, вы можете взять любые отрицательные временные интервалы, сделать их положительными, вызвать FileTimeToSystemTime, а затем (если исходный ввод был отрицательным) выбрать компоненты, чтобы сделать отрицательными.
Я вижу здесь плохой дизайн. Временной интервал, разница между двумя временами, одинакова при измерении системным временем и временем файла. W32 FileTimeToSystemTime прав в том, что не принимает отрицательные значения, потому что это не имеет смысла. Период в 2 секунды - это период в 2 секунды, независимо от того, какой часовой пояс вы использовали.
// РЕДАКТИРОВАТЬ: Вторая проблема. SYSTEMTIME каким-то образом может представлять промежуток времени, но это было бы ошибочно. Т.е. месяц не может использоваться при измерении промежутков времени.