在SYSTEMTIME上执行算术

Pet*_*ter 5 windows msdn systemtime

我有一个在SYSTEMTIME中表示的时间值,我想从它添加/减去1小时并获得新获得的SYSTEMTIME.我希望转换应该考虑加/减或月变化或e1年变化的日期变化.

如果有一些Windows API在SYSTEMTIME上运算,有人可以帮助我

Mar*_*rco 10

如果您使用的是C#(或VB.NET或ASP.NET),则可以使用

DateTime dt = DateTime.Now.AddHours(1);
Run Code Online (Sandbox Code Playgroud)

您可以使用负数来减去:

DateTime dt = DateTime.Now.AddHours(-1);
Run Code Online (Sandbox Code Playgroud)

编辑: 我从这篇文章中提取了一个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;
 }
Run Code Online (Sandbox Code Playgroud)

如果你想加一小时使用 SYSTEMTIME s2 = add(s1, 60*60)


Ric*_*gin 7

要在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);
}
Run Code Online (Sandbox Code Playgroud)


小智 5

#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);
}
Run Code Online (Sandbox Code Playgroud)