выполнение арифметики на SYSTEMTIME - PullRequest
5 голосов
/ 29 ноября 2011

У меня есть значение времени, представленное в SYSTEMTIME, я хочу добавить / вычесть 1 час из него и получить вновь полученный SYSTEMTIME.Я хочу, чтобы преобразование позаботилось об изменении даты при сложении / вычитании или изменении месяца или e1 года.

Может ли кто-нибудь помочь мне с этим, если есть какой-то windows api, который выполняет арифметику для SYSTEMTIME

Ответы [ 3 ]

10 голосов
/ 29 ноября 2011

Если вы используете C # (или VB.NET, или ASP.NET), вы можете использовать

DateTime dt = DateTime.Now.AddHours(1);

Вы можете использовать отрицательные числа для вычитания:

DateTime dt = DateTime.Now.AddHours(-1);

РЕДАКТИРОВАНИЕ: Я извлекаю asnwer из этого поста

Они предлагают преобразовать 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;
    u.QuadPart += seconds / c_dSecondsPer100nsInterval; 

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

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

Если вы хотите добавить час, используйте SYSTEMTIME s2 = add(s1, 60*60)

6 голосов
/ 29 мая 2013

Чтобы добавить знаковые секунды (вперед или назад по времени) в C ++:

const double clfSecondsPer100ns = 100. * 1.E-9;
void iAddSecondsToSystemTime(SYSTEMTIME* timeIn, SYSTEMTIME* timeOut, double tfSeconds)
{
    union {
        ULARGE_INTEGER li;
        FILETIME       ft;
    };

    // Convert timeIn to filetime
    SystemTimeToFileTime(timeIn, &ft);

    // Add in the seconds
    li.QuadPart += tfSeconds / clfSecondsPer100ns;

    // Convert back to systemtime
    FileTimeToSystemTime(&ft, timeOut);
}
5 голосов
/ 08 декабря 2013
#include <stdio.h>
#include <windows.h>
#define NSEC 60*60

main()
{
SYSTEMTIME st;
FILETIME ft;

// Get local time from system
GetLocalTime(&st);

printf("%02d/%02d/%04d %02d:%02d:%02d\n",
  st.wDay,st.wMonth,st.wYear,st.wHour,st.wMinute,st.wSecond);

// Convert to filetime
SystemTimeToFileTime(&st,&ft);

// Add NSEC seconds
((ULARGE_INTEGER *)&ft)->QuadPart +=(NSEC*10000000LLU);

// Convert back to systemtime
FileTimeToSystemTime(&ft,&st);

printf("%02d/%02d/%04d %02d:%02d:%02d\n",
  st.wDay,st.wMonth,st.wYear,st.wHour,st.wMinute,st.wSecond);
}
...