effectuer l’arithmétique sur SYSTEMTIME

J’ai une valeur de temps représentée dans SYSTEMTIME, je veux en append / soustraire 1 heure et obtenir le SYSTEMTIME nouvellement obtenu. Je veux que la conversion prenne en compte le changement de date sur l’addition / soustraction ou le changement de mois ou le changement d’année.

Est-ce que quelqu’un peut m’aider avec ceci s’il y a des api de Windows qui font l’arithmétique sur SYSTEMTIME

    Si vous utilisez C # (ou VB.NET ou ASP.NET), vous pouvez utiliser

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

    Vous pouvez utiliser des nombres négatifs pour soustraire:

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

    EDITED: J’extrais une réponse de cet article

    Ils suggèrent de convertir SYSTEMTIME en FILETIME, qui est un nombre de tics depuis une époque. Vous pouvez ensuite append le nombre requirejs de «ticks» (c.-à-d. Intervalles de 100 ns) pour indiquer votre heure et reconvertir en SYSTEMTIME.

    La structure ULARGE_INTEGER est une union avec un membre QuadPart, qui est un numéro 64 bits, qui peut être directement ajouté (sur du matériel récent).

     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; } 

    Si vous voulez append une heure, utilisez SYSTEMTIME s2 = add(s1, 60*60)

    Pour append des secondes signées (en avant ou en arrière dans le temps) en 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); } 
     #include  #include  #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); }