2011-11-29 11 views
5

Ho un valore temporale rappresentato in SYSTEMTIME, voglio aggiungere/sottrarre 1 ora da esso e ottenere il SYSTEMTIME appena ottenuto. Voglio che la conversione si prenda cura della modifica della data di addizione/sottrazione o modifica del mese o cambio di anno e1.eseguendo aritmetica su SYSTEMTIME

Qualcuno mi può aiutare con questo se c'è qualche API di Windows che fa aritmetica su SYSTEMTIME

+1

Che lingua stai usando ? E cosa intendi per SYSTEMTIME? –

+0

@Marco scusa sono arrivato in ritardo ..e sì thanxx man ha funzionato bene per me – Peter

risposta

10

Se stai usando C# (o VB.NET, o ASP.NET) è possibile utilizzare

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

È possibile utilizzare numeri negativi per sottrarre:

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

Modificato: ho estrarre un asnwer da 0.123.589,898963 millions

Essi suggeriscono conversione SYSTEMTIME a FILETIME, che è un numero di zecche dal un'epoca. È quindi possibile aggiungere il numero richiesto di "tick" (ad esempio intervalli di 100ns) per indicare l'ora e riconvertire in SYSTEMTIME.

La struttura ULARGE_INTEGER è un'unione con un membro QuadPart, che è un numero a 64 bit, che può essere aggiunto direttamente a (su hardware recente).

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

Se si desidera aggiungere un uso un'ora SYSTEMTIME s2 = add(s1, 60*60)

+0

sto usando Windows SYSTEMTIME struttura – Peter

+0

@Peter: ok, ma quale linguaggio di programmazione stai usando? – Marco

+0

@Peter: dai un'occhiata alla mia risposta modificata – Marco

5

Per aggiungere secondi firmati (in avanti o indietro nel tempo) in 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); 
}