2011-11-29 19 views
5

Mam wartość czasu reprezentowane w SYSTEMTIME, chcę dodać/odjąć 1 godzinę od niego i uzyskać nowo uzyskany SYSTEMTIME. Chcę, aby konwersja zajmowała się zmianą daty dodania/odjęcia lub zmiany miesiąca lub zmiany roku e1.wykonywanie operacji arytmetycznych na SYSTEMTIME

Czy ktoś może mi pomóc z tym, czy jest jakaś Windows API, które wykonuje działania arytmetyczne na SYSTEMTIME

+1

Jakiego języka używasz ? A co rozumiesz przez SYSTEMTIME? –

+0

@Marco przepraszam, że spóźniłem się ..i tak, człowieku thanxx to zadziałało dla mnie – Peter

Odpowiedz

10

Jeśli używasz C# (lub VB.NET, lub ASP.NET) można użyć

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

Możesz używać liczb ujemnych odjąć:

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

edycja: I wyodrębnić asnwer z this post

Sugerują konwersji SYSTEMTIME do FILETIME, który jest liczba kleszcze od epoki. Następnie można dodać wymaganą liczbę "tyknięć" (tj. Odstępy 100ns), aby wskazać swój czas, i przekonwertować ponownie na SYSTEMTIME.

Struktura ULARGE_INTEGER jest połączeniem z elementem QuadPart, który jest numerem , który można bezpośrednio dodać (na ostatnim sprzęcie).

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

Jeśli chcesz dodać korzystanie godzinny SYSTEMTIME s2 = add(s1, 60*60)

+0

Używam struktury windows SYSTEMTIME – Peter

+0

@Peter: ok, ale jakiego języka programowania używasz? – Marco

+0

@Peter: spójrz na moją zmienioną odpowiedź – Marco

5

Aby dodać podpisane sekund (do przodu lub do tyłu w czasie) w 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); 
} 
Powiązane problemy