2011-11-29 29 views
5

私はSYSTEMTIMEで表される時間値を持っていますが、そこから1時間を加算/減算し、新しく取得したSYSTEMTIMEを取得したいと思います。私は、変換が加減算または月の変更またはe1の年の変更の日付の変更を処理する必要があります。あなたはC#(またはVB.NET、またはASP.NET)を使用している場合はSYSTEMTIME算術演算をSYSTEMTIMEで実行する

+1

あなたはどのような言語を使用しています? SYSTEMTIMEはどういう意味ですか? –

+0

@Marco申し訳ありません私は遅くなってしまいました。そして、ええ、thanxx人それは私のためにうまく働いた – Peter

答えて

10

上の算術演算を行い、いくつかのWindows APIが存在する場合

誰かがあなたが

DateTime dt = DateTime.Now.AddHours(1); 
を使用することができますこれで私を助けることができます

あなたは減算する負の数を使用することができます。

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

編集: 私はからasnwerを抽出します

彼らは、エポック時から の数字のFITITIMEに変換することを提案しています。その後、必要な数の「ダニ」 (つまり100ns間隔)を追加して、あなたの時刻を示し、 SYSTEMTIMEに変換することができます。

ULARGE_INTEGER構造体は、(最近のハードウェアで)直接追加できる64ビットの数値 であるQuadPartメンバーを持つ共用体です。

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

あなたはC++で(前方または後方時間内)に署名秒を追加するには時間の使用SYSTEMTIME s2 = add(s1, 60*60)

+0

私は窓を使用していますシステム構造 – Peter

+0

@ピーター:いいですが、どのプログラミング言語を使用していますか? – Marco

+0

@Peter:編集した回答 – Marco

5

を追加したい場合は、次の

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