2011-11-29 3 views
5

J'ai une valeur de temps représentée dans SYSTEMTIME, je veux ajouter/soustraire 1 heure de lui et obtenir le SYSTEMTIME nouvellement obtenu. Je souhaite que la conversion prenne en charge le changement de date lors de l'ajout/la soustraction ou le changement du mois ou le changement d'un an.effectuant arithmétique sur SYSTEMTIME

Quelqu'un peut-il me aider s'il y a quelques fenêtres api qui fait des opérations arithmétiques sur SYSTEMTIME

+1

Quelle langue utilisez-vous ? Et que voulez-vous dire par SYSTEMTIME? –

+0

@Marco désolé je me suis en retard ..et oui thanxx homme ça a bien fonctionné pour moi – Peter

Répondre

10

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

éDITÉE: I extrait un asnwer de this post

Ils suggèrent la conversion SYSTEMTIME à FILETIME, qui est un certain nombre de tiques depuis une époque. Vous pouvez ensuite ajouter le nombre requis de "ticks" (c'est-à-dire des intervalles de 100ns) pour indiquer votre temps, et revenir à SYSTEMTIME. La structure ULARGE_INTEGER est une union avec un membre QuadPart, qui est un nombre de 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 ajouter une heure d'utilisation SYSTEMTIME s2 = add(s1, 60*60)

+0

J'utilise Windows structure SYSTEMTIME – Peter

+0

@Peter: ok, mais quel langage de programmation utilisez-vous? – Marco

+0

@Peter: jetez un oeil à ma réponse éditée – Marco

5

Pour ajouter signé secondes (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); 
} 
4
#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); 
}