tags:

views:

91

answers:

1

What is the best way to set the machine time in C#?

+6  A: 

You'll probably need to use the Win32 API to do this, as I'm fairly sure there's nothing baked into the framework:

[StructLayout(LayoutKind.Sequential)] 
public struct SYSTEMTIME { 
 public short wYear; 
 public short wMonth; 
 public short wDayOfWeek; 
 public short wDay; 
 public short wHour; 
 public short wMinute; 
 public short wSecond; 
 public short wMilliseconds; 
 } 
 [DllImport("kernel32.dll", SetLastError=true)] 
public static extern bool SetSystemTime(ref SYSTEMTIME theDateTime );

There's a fuller example at PInvoke.net, the code's a bit dense, but a simple excerpt that's fairly plain to read and understand is this:

SYSTEMTIME st = new SYSTEMTIME();
GetSystemTime(ref st);
// Adds one hour to the time that was retrieved from GetSystemTime
st.wHour = (ushort)(st.wHour + 1 % 24);
var result = SetSystemTime(ref st);
if (result == false)
{
     // Something went wrong
}
else
{
    // The time will now be 1hr later than it was previously
}

The relevant specific Win32 API's are SetSystemTime, GetSystemTime and the SYSTEMTIME structure.

Rob
Just as a heads up, you'll need adminstrator permissions to set the system time. A standard user cannot change the time.
Joshua
@Joshua, very true, +1
Rob
You defined SetSystemTime to return a bool but check if the result == 0.
Wesley Wiser