Изменение значений даты и времени с использованием SYSTEMTIME, FILETIME и ULARGE_INTEGER - PullRequest
7 голосов
/ 25 февраля 2011

Я делаю программу на C ++ с использованием Visual Studio 2005, которая должна создавать водяной знак со временем на наборе изображений.

Эти изображения взяты из видео, которые были обработаны через определенные промежутки времени. Я пытаюсь изменить время на каждом изображении с помощью SYSTEMTIME. Я посмотрел на MSDN, и он говорит не изменять значения внутри самой SYSTEMTIME, а преобразовать его в FILETIME, а затем в ULARGE_INTEGER. Мой вопрос: как разделена ULARGE_INTEGER? Является ли HighPart датой, а Low - временем, и если это так, как мне принять во внимание опрокидывание? Например, если изображение появляется в 23:58 25.02.2011 и продолжается до 12:11 26.02.2011? Будет ли просто добавление указанного значения автоматически приниматься во внимание и показываться при его преобразовании обратно в переменную SYSTEMTIME?

Заранее спасибо за помощь.

1 Ответ

8 голосов
/ 25 февраля 2011

Они предлагают преобразовать SYSTEMTIME в FILETIME, то есть число тиков с эпохи.Затем вы можете добавить необходимое количество «тиков» (т.е. интервалы 100 нс), чтобы указать ваше время, и преобразовать обратно в SYSTEMTIME.

. Структура ULARGE_INTEGER представляет собой объединение сQuadPart член, представляющий собой 64-битное число, которое можно напрямую добавить (на новейшем оборудовании).

SYSTEMTIME add( SYSTEMTIME s, double seconds ) {

    FILETIME f;
    SystemTimeToFileTime( &s, &f );

    ULARGE_INTEGER u  ; 
    memcpy( &u  , &f , sizeof( u ) );

    const double c_dSecondsPer100nsInterval = 100.*1.e-9;
    const double c_dNumberOf100nsIntervals = 
                    seconds / c_dSecondsPer100nsInterval;

    // note: you may want to round the number of intervals.
    u.QuadPart += c_dNumberOf100nsIntervals;

    memcpy( &f, &u, sizeof( f ) );

    FileTimeToSystemTime( &f, &s );
    return s;
 }
...