Как можно реализовать FileTimeToSystemTime? - PullRequest
5 голосов
/ 16 июня 2010

Я пишу простую оболочку вокруг структуры Win32 FILETIME.boost::datetime имеет большую часть того, что я хочу, за исключением того, что мне нужен любой тип даты, который я использую для интерполяции с API-интерфейсами Windows без проблем.

С этой целью я решил написать свои собственные вещи для этого- большинство операций не так уж и сложны.Я реализую TimeSpan-подобный тип на данный момент, но я не уверен, как бы я реализовал FileTimeToSystemTime.Я мог бы просто использовать встроенную в систему функцию FileTimeToSystemTime, за исключением того, что FileTimeToSystemTime не может обрабатывать отрицательные даты - мне нужно иметь возможность представлять что-то вроде «-12 секунд».

Как должно быть реализовано что-то подобное?

Billy3

Ответы [ 3 ]

2 голосов
/ 16 июня 2010

Типы данных Windows SYSTEMTIME и FILETIME предназначены для представления определенной даты и времени.Они не очень подходят для представления разницы во времени.Разница во времени лучше, чем простое целое число, представляющее число между двумя SYSTEMTIMEs или FILETIMEs.может быть секунд или меньше, если вам нужна большая точность.

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

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();
}
1 голос
/ 16 июня 2010

Предполагая, что у вас нет проблем со структурой, имеющей все неподписанные компоненты, вы можете взять любые отрицательные временные области, сделать их положительными, вызвать FileTimeToSystemTime, а затем (если исходный вход был отрицательным) выбрать компоненты, чтобы сделать отрицательными.

0 голосов
/ 16 июня 2010

Я вижу плохой дизайн здесь. Промежуток времени, разница между двумя временами, одинакова при измерении с системным временем и с временем файла. W32 FileTimeToSystemTime правильно не принимает отрицательные значения, потому что это не имеет смысла. Период в 2 секунды - это период в 2 секунды, независимо от того, какой часовой пояс вы использовали.

// EDIT: Вторая проблема SYSTEMTIME каким-то образом может представлять промежуток времени, но это было бы ошибочным. То есть При измерении промежутков времени месяц не используется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...