diff --git a/RTCSync.cli/Options/SetTimeOption.cs b/RTCSync.cli/Options/SetTimeOption.cs index 828b49b..1ce95c7 100644 --- a/RTCSync.cli/Options/SetTimeOption.cs +++ b/RTCSync.cli/Options/SetTimeOption.cs @@ -53,7 +53,7 @@ public class SetTimeOption : IOption for (var i = 0; i < 3; i++) { // FIXME: вызывает падение на windows 7 - var dt = DateTime.Now; + var dt = WindowsTimeUtils.Now(); DeviceWriters.SetTime(device, dt); } } diff --git a/RTCSync.cli/RTCSync.cli.csproj b/RTCSync.cli/RTCSync.cli.csproj index 609d0d9..56c88c3 100644 --- a/RTCSync.cli/RTCSync.cli.csproj +++ b/RTCSync.cli/RTCSync.cli.csproj @@ -7,12 +7,17 @@ enable enable true + link + false true RTCSync + Size + true + Speed - + diff --git a/RTCSync.cli/Utils/WindowsTimeUtils.cs b/RTCSync.cli/Utils/WindowsTimeUtils.cs index c7b35e8..d48c650 100644 --- a/RTCSync.cli/Utils/WindowsTimeUtils.cs +++ b/RTCSync.cli/Utils/WindowsTimeUtils.cs @@ -7,20 +7,39 @@ public abstract class WindowsTimeUtils // c# datetime set [DllImport("kernel32.dll")] public static extern bool SetSystemTime(ref SystemTime time); - + [DllImport("kernel32.dll")] public static extern void GetSystemTime(ref SystemTime time); - + [StructLayout(LayoutKind.Sequential)] - public struct SystemTime(DateTime dt) + public struct SystemTime { - public ushort Year = (ushort)dt.Year; - public ushort Month = (ushort)dt.Month; - public ushort DayOfWeek = (ushort)dt.DayOfWeek; - public ushort Day = (ushort)dt.Day; - public ushort Hour = (ushort)dt.Hour; - public ushort Minute = (ushort)dt.Minute; - public ushort Second = (ushort)dt.Second; - public ushort Milliseconds = (ushort)dt.Millisecond; + public ushort Year, Month, DayOfWeek, Day; + public ushort Hour, Minute, Second, Milliseconds; + + public SystemTime() { } + + public SystemTime(DateTime dt) + { + Year = (ushort)dt.Year; + Month = (ushort)dt.Month; + DayOfWeek = (ushort)dt.DayOfWeek; + Day = (ushort)dt.Day; + Hour = (ushort)dt.Hour; + Minute = (ushort)dt.Minute; + Second = (ushort)dt.Second; + Milliseconds = (ushort)dt.Millisecond; + } + } + + // Фикс для Windows 7 SP1 без обновлений + // DataTime.Now использует слишком новый API + public static DateTime Now() + { + var st = new SystemTime(); + GetSystemTime(ref st); + return new DateTime(st.Year, st.Month, st.Day, + st.Hour, st.Minute, st.Second, st.Milliseconds, + DateTimeKind.Utc).ToLocalTime(); } } \ No newline at end of file