2011-11-29 13 views
5

Tengo un valor de tiempo representado en SYSTEMTIME, quiero agregar/restar 1 hora de él y obtener el SYSTEMTIME recién obtenido. Deseo que la conversión se haga cargo del cambio de fecha en la suma/resta o cambio de mes o cambio de e1 año.realizando Aritmética en SYSTEMTIME

Alguien me puede ayudar con esto si hay algo de API de Windows, que hace aritmética sobre SYSTEMTIME

+1

Qué idioma se está utilizando ? ¿Y a qué te refieres con SYSTEMTIME? –

+0

@Marco lo siento tarde ... y sí hombre thanxx funcionó bien para mí – Peter

Respuesta

10

Si estás usando C# (o VB.NET, o ASP.NET) que puede utilizar

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

puede utilizar números negativos para restar:

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

editado: que extraer un asnwer desde this post

Sugieren convertir SYSTEMTIME a FILETIME, que es un número de garrapatas desde una época. A continuación, puede agregar el número requerido de 'ticks' (es decir, 100ns intervalos) para indicar su tiempo y convertir de nuevo a SYSTEMTIME.

La estructura ULARGE_INTEGER es una unión con un miembro de QuadPart, que es un número de 64 bits, que se puede agregar directamente (en el hardware reciente).

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

Si desea agregar un uso horas SYSTEMTIME s2 = add(s1, 60*60)

+0

estoy usando Windows SYSTEMTIME estructura – Peter

+0

@Peter: bien, pero ¿qué lenguaje de programación estás usando? – Marco

+0

@Peter: eche un vistazo a mi respuesta editada – Marco

5

Para añadir segundos firmados (hacia delante o hacia atrás en el tiempo) en 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); 
}