2011-11-29 16 views
5

Tôi có một giá trị thời gian được biểu thị trong SYSTEMTIME, tôi muốn cộng/trừ 1 giờ từ nó và lấy SYSTEMTIME mới thu được. Tôi muốn chuyển đổi nên chăm sóc thay đổi ngày cộng/trừ hoặc thay đổi tháng hoặc thay đổi e1 năm.thực hiện Số học trên SYSTEMTIME

Ai đó có thể giúp tôi với điều này nếu có một số cửa sổ api mà làm số học trên SYSTEMTIME

+1

Ngôn ngữ nào bạn đang sử dụng ? Và bạn có ý nghĩa gì bởi SYSTEMTIME? –

+0

@Marco xin lỗi tôi đã muộn .. và yeah thanxx người đàn ông nó làm việc tốt cho tôi – Peter

Trả lời

10

Nếu bạn đang sử dụng C# (hoặc VB.NET hoặc ASP.NET), bạn có thể sử dụng

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

Bạn có thể sử dụng số âm trừ:

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

EDITED: tôi trích xuất một asnwer từ this post

Chúng đề xuất chuyển đổi SYSTEMTIME thành FILETIME, đây là một số số bọ ve từ kỷ nguyên. Sau đó, bạn có thể thêm số 'số' bắt buộc là (nghĩa là khoảng 100ns) để cho biết thời gian của bạn và chuyển đổi lại thành SYSTEMTIME.

Cấu trúc ULARGE_INTEGER là một liên minh với thành viên QuadPart, là số 64 bit, có thể được thêm trực tiếp vào (trên phần cứng gần đây).

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

Nếu bạn muốn thêm một sử dụng giờ SYSTEMTIME s2 = add(s1, 60*60)

+0

tôi đang sử dụng Windows SYSTEMTIME cấu trúc – Peter

+0

@Peter: ok, nhưng ngôn ngữ lập trình bạn đang sử dụng? – Marco

+0

@Peter: hãy xem câu trả lời đã chỉnh sửa của tôi – Marco

5

Để thêm giây ký (về phía trước hoặc phía sau trong thời gian) trong 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); 
} 
Các vấn đề liên quan