Изменение значений даты и времени с использованием SYSTEMTIME, FILETIME и ULARGE_INTEGER

Я делаю программу на 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 ответ

Решение

Они предлагают конвертировать 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;
 }
Другие вопросы по тегам