using System; using System.Runtime.InteropServices; namespace ThunderboltTimeSync { class SystemTimeUtils { public class SystemTimeException : Exception { public SystemTimeException(int hresult) : base(string.Format("The system time could not be set (HRESULT 0x{0:X8}).", hresult)) { HResult = hresult; } } private class WindowsAPI { [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")] public static extern int GetLastError(); [DllImport("kernel32.dll", SetLastError = true)] public static extern bool SetSystemTime(ref SYSTEMTIME lpSystemTime); [DllImport("kernel32.dll")] public static extern void GetSystemTime(ref SYSTEMTIME lpSystemTime); } /// /// Sets the system time. /// /// The date and time to set the system clock to. public static void SetSystemTime(DateTime dateTime) { WindowsAPI.SYSTEMTIME systemTime = new WindowsAPI.SYSTEMTIME(); systemTime.wYear = (short) dateTime.Year; systemTime.wMonth = (short) dateTime.Month; // wDayOfWeek is ignored by SetSystemTime systemTime.wDay = (short) dateTime.Day; systemTime.wHour = (short) dateTime.Hour; systemTime.wMinute = (short) dateTime.Minute; systemTime.wSecond = (short) dateTime.Second; systemTime.wMilliseconds = (short) dateTime.Millisecond; bool setSucceeded = WindowsAPI.SetSystemTime(ref systemTime); if (!setSucceeded) { throw new SystemTimeException(WindowsAPI.GetLastError()); } } /// /// Retrieves the current system time. /// /// The current system time. public static DateTime GetSystemTime() { WindowsAPI.SYSTEMTIME systemTime = new WindowsAPI.SYSTEMTIME(); WindowsAPI.GetSystemTime(ref systemTime); DateTime systemDateTime = new DateTime( systemTime.wYear, systemTime.wMonth, systemTime.wDay, systemTime.wHour, systemTime.wMinute, systemTime.wSecond, systemTime.wMilliseconds ); return systemDateTime; } } }