2009-02-06 14 views
8

का उपयोग कर रहा का उपयोग कर अपने सिस्टम समय अद्यतन करने के लिए कोशिश कर रहा हूँ निम्नलिखित प्रणाली की तारीख और/या समय अद्यतन करने के लिए कैसे:नेट

[StructLayout(LayoutKind.Sequential)] 
private struct SYSTEMTIME 
{ 
    public ushort wYear; 
    public ushort wMonth; 
    public ushort wDayOfWeek; 
    public ushort wDay; 
    public ushort wHour; 
    public ushort wMinute; 
    public ushort wSecond; 
    public ushort wMilliseconds; 
} 

[DllImport("kernel32.dll", EntryPoint = "GetSystemTime", SetLastError = true)] 
private extern static void Win32GetSystemTime(ref SYSTEMTIME lpSystemTime); 

[DllImport("kernel32.dll", EntryPoint = "SetSystemTime", SetLastError = true)] 
private extern static bool Win32SetSystemTime(ref SYSTEMTIME lpSystemTime); 

public void SetTime() 
{ 
    TimeSystem correctTime = new TimeSystem(); 
    DateTime sysTime = correctTime.GetSystemTime(); 
    // Call the native GetSystemTime method 
    // with the defined structure. 
    SYSTEMTIME systime = new SYSTEMTIME(); 
    Win32GetSystemTime(ref systime); 

    // Set the system clock ahead one hour. 
    systime.wYear = (ushort)sysTime.Year; 
    systime.wMonth = (ushort)sysTime.Month; 
    systime.wDayOfWeek = (ushort)sysTime.DayOfWeek; 
    systime.wDay = (ushort)sysTime.Day; 
    systime.wHour = (ushort)sysTime.Hour; 
    systime.wMinute = (ushort)sysTime.Minute; 
    systime.wSecond = (ushort)sysTime.Second; 
    systime.wMilliseconds = (ushort)sysTime.Millisecond; 

    Win32SetSystemTime(ref systime); 
} 

जब मैं सब कुछ अच्छा लग रहा है डिबग और सभी मूल्यों सही हैं लेकिन जब यह सिस्टम के वास्तविक समय (प्रदर्शन समय) के Win32SetSystemTime (रेफ सिस्टिम) को कॉल करता है और बदलता रहता है। अजीब बात यह है कि जब मैं Win32GetSystemTime (रेफ सिस्टिम) कहता हूं तो यह मुझे नया अपडेट किया गया समय देता है। क्या कोई मुझे इस पर कुछ मदद दे सकता है?

+0

के रूप में मैं देखता हूँ, TimeSystem आधार प्रणाली कक्षा से गैर है, तो आप यह सुनिश्चित करें कि TimeSystem में परिवर्तन नहीं करते पहर? Win32SetSystemTime (रेफ सिस्टिम) पर टिप्पणी करने का प्रयास करें; लाइन – Avram

उत्तर

4

आपके पास मौजूद कोड के मुताबिक, आप उस समय में वृद्धि नहीं कर रहे हैं। ऐसा लगता है कि आप अपने सिस्टम समय को उसी समय सटीक रूप से सेट कर रहे हैं जब आप Win32GetSystemTime कहलाते थे।

प्रयास करें:

systime.wHour = (ushort)(sysTime.Hour + 1); 
+0

लेकिन मैं घंटे में वृद्धि नहीं करना चाहता हूं। मैं इसे किसी अन्य समय पर सेट करना चाहता हूं। – user62958

+0

आपके कोड में कोड टिप्पणी विशेष रूप से "एक घंटा आगे सिस्टम घड़ी सेट करें" कहती है। आप बस अपना सिस्टम समय नहीं बदल रहे हैं क्योंकि आप इसे बदल नहीं रहे हैं। इसे किसी अन्य समय पर सेट करने के लिए, आपको वर्तमान समय की तुलना में एक अलग समय में जिस पद्धति को आप भेज रहे हैं उसे सेट करना होगा। –

6

आपकी समस्या यह है कि आप गलत PInvoke हस्ताक्षर के एक जोड़े है। सबसे उल्लेखनीय SetSystemTime में एक गैर-शून्य वापसी मान होना चाहिए। यहां पर सही हस्ताक्षर

/// Return Type: BOOL->int 
    ///lpSystemTime: SYSTEMTIME* 
    [System.Runtime.InteropServices.DllImportAttribute("kernel32.dll", EntryPoint="SetSystemTime")] 
    [return: System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.Bool)] 
public static extern bool SetSystemTime([InAttribute()] ref SYSTEMTIME lpSystemTime) ; 

मेरे संदेह है कि एक वापसी मूल्य का ताला ढेर और आवश्यक रूप से बुरा डेटा के साथ समाप्त हो गया SetSystemTime समारोह में गड़बड़ है।

2
 

TimeSpan diffLocalTime = DateTime.Now - DateTime.UtcNow; 
SystemTime systemTime = new SystemTime(); 
systemTime.Second = ... 
systemTime.Minute =.... 
systemTime.Hour -= (ushort)(diffLocalTime.Hours + 1); // 00:59:59 I rounded as 1 hour 
bool result = SetSystemTime(ref systemTime); 
 

यह स्थानीय समय क्षेत्र के लिए यह सही ढंग से काम कर रहा है।

1
[DllImport("Kernel32.dll")] 
public static extern bool SetLocalTime(ref StractData.Datetime.SYSTEMTIME Time); 
0

आपके पास सिर्फ एक विशेषाधिकार समस्या है, जब मैं विशेषाधिकारों के बिना है कि कार्यक्रम चलाने के लिए, यह does'nt तारीख बदलती है, लेकिन अगर मैं कार्यक्रम पर राइट क्लिक करते हैं, और प्रशासक के रूप में चलाने पर क्लिक करें, यह काम करता है!

2

पी/आमंत्रण की कोई आवश्यकता नहीं - माइक्रोसॉफ्ट से उपलब्ध एक आसान तरीका (लेकिन अच्छी तरह से ज्ञात नहीं) है। विज़ुअल बेसिक असेंबली। यदि आप सी # में हैं, तो बस इसके लिए एक संदर्भ जोड़ना याद रखें।

आप दिनांक या समय प्राप्त करने और बदलने के लिए Microsoft.VisualBasic.DateAndTime कक्षा का उपयोग कर सकते हैं। गुण Today और TimeOfDay में सेटर्स हैं जो दिनांक या समय में परिवर्तन करेंगे।

आपको अभी भी प्रासंगिक विशेषाधिकारों की आवश्यकता है - नीचे दिए गए एमएसडीएन दस्तावेज लिंक का संदर्भ लें।

यहाँ एक मनमाना उदाहरण है समय बदलने के लिए: MSDN पर

public static void SetTimeToPast() 
{ 
    Microsoft.VisualBasic.DateAndTime.TimeOfDay = DateTime.Now.AddMinutes(-2); 
} 

संदर्भ: http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.dateandtime(v=vs.110).aspx

+0

मेरे लिए, सिस्टम की तारीख बदलना Microsoft.VisualBasic.DateAndTime.TimeOfDay.Today = [नई तारीख] चाल चल रही है। बहुत बहुत धन्यवाद। यह अब तक का सबसे आसान और साफ समाधान है। – FrenkyB

+0

Win32SetSystemTime का उपयोग करना मेरे लिए काम करता है, लेकिन दुर्भाग्यवश यह नहीं करता है। – Matt