2011-11-29 28 views
5

SYSTEMTIME'de temsil edilen bir zaman değerine sahibim, ondan 1 saat eklemek/çıkarmak ve yeni elde edilen SYSTEMTIME'i almak istiyorum. Dönüşümün ekleme/çıkarma veya ay değişikliği veya e1 yıl değişikliği ile ilgili tarih değişikliğini dikkate almasını istiyorum.SYSTEMTIME üzerinde Aritmetik gerçekleştiriliyor

bazı pencereler SYSTEMTIME

+1

Hangi dili kullanıyor ? Ve SYSTEMTIME ile ne demek istiyorsun? –

+0

@Marco üzgünüm geç var .. ve evet thanxx adam benim için iyi çalıştı – Peter

cevap

10

C# kullanıyorsanız (veya VB.NET, veya ASP.NET) üzerinde aritmetik yapar API Eğer

DateTime dt = DateTime.Now.AddHours(1); 
kullanabilirsiniz varsa birisi bana bu konuda yardımcı olabilir

Sen çıkarmak negatif numaralarını kullanabilirsiniz:

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

EDITED: Benbir asnwer ayıklamak

Bunlar bir dönem yana keneler bir sayıdır FILETIME için SYSTEMTIME dönüştürme öneriyoruz. Ardından, zamanınızı belirtmek için gerekli '' keneler 'sayısını (yani 100ns aralıklarla) ekleyebilir ve SYSTEMTIME öğesine dönüştürebilirsiniz.

ULARGE_INTEGER yapısı, bir QuadPart üyesi olan, bir 64bit numarası olan ve (en son donanımda) doğrudan eklenebilen bir birleşimdir.

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++ da (ileri veya geri zamanında) imzalı saniye eklemek için bir saat kullanımını SYSTEMTIME s2 = add(s1, 60*60)

+0

Windows SYSTEMTIME yapı kullanıyorum – Peter

+0

@Peter: ok, ama hangi programlama dili kullanıyorsunuz? – Marco

+0

@Peter: benim düzenlenmiş cevabım – Marco

5

eklemek istiyorsanız:

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