2011-11-29 90 views
5

我有SYSTEMTIME中表示的時間值,我想從它添加/減去1小時並獲得新獲得的SYSTEMTIME。我希望轉換應該考慮加/減或日月變化或e1年變化的日期變化。在SYSTEMTIME上執行算術

有人可以幫助我,如果有一些窗口API,它確實對SYSTEMTIME

+1

您正在使用什麼語言? SYSTEMTIME是什麼意思? –

+0

@Marco對不起,我遲到了..和是thanxx男人對我來說工作得很好 – Peter

回答

10

如果您正在使用C#(或VB.NET或ASP.NET)算術可以使用

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

您可以使用負數減:

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

編輯: 我從提取asnwer

他們建議轉換SYSTEMTIME到FILETIME,這是因爲一個曆元的數的 蜱。然後,您可以添加所需數量的'記號' (即100ns間隔)以指示您的時間,並將其轉換回 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)

+0

我正在使用Windows SYSTEMTIME結構 – Peter

+0

@Peter:好的,但你使用哪種編程語言? – Marco

+0

@Peter:看看我編輯的答案 – Marco

5

要添加簽署秒(向前或向後的時間)在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); 
}