私は SYSTEMTIME で表される時間値を持っています。それに 1 時間を加算/減算して、新しく取得した SYSTEMTIME を取得したいと考えています。変換で、加算/減算または月の変更または e1 年の変更の日付の変更を処理する必要があります。
SYSTEMTIMEで算術演算を行うWindows APIがある場合、誰かがこれを手伝ってくれますか
私は SYSTEMTIME で表される時間値を持っています。それに 1 時間を加算/減算して、新しく取得した SYSTEMTIME を取得したいと考えています。変換で、加算/減算または月の変更または e1 年の変更の日付の変更を処理する必要があります。
SYSTEMTIMEで算術演算を行うWindows APIがある場合、誰かがこれを手伝ってくれますか
C#(またはVB.NET、またはASP.NET)を使用している場合は、次を使用できます。
DateTime dt = DateTime.Now.AddHours(1);
負の数を使用して、以下を減算できます。
DateTime dt = DateTime.Now.AddHours(-1);
編集:私はこの投稿 から回答を抽出します
彼らは、SYSTEMTIMEをFILETIMEに変換することを提案しています。これは、エポック以降のティック数です。次に、必要な数の「ティック」(つまり、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;
}
1時間を追加したい場合はSYSTEMTIME s2 = add(s1, 60*60)
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);
}
#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);
}