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
2010-08-02 21:01:18
Just as a heads up, you'll need adminstrator permissions to set the system time. A standard user cannot change the time.
Joshua
2010-08-02 21:04:11
@Joshua, very true, +1
Rob
2010-08-02 21:05:15
You defined SetSystemTime to return a bool but check if the result == 0.
Wesley Wiser
2010-08-02 21:07:35