From 8e32e311217f41bd527e4bccd9d62958f826d0db Mon Sep 17 00:00:00 2001 From: MuseCat Date: Thu, 25 Jun 2026 16:31:44 +0300 Subject: [PATCH] =?UTF-8?q?=D1=84=D0=B8=D0=BA=D1=81=D1=8B=20windows=207?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- RTCSync.cli/Options/SetTimeOption.cs | 2 +- RTCSync.cli/RTCSync.cli.csproj | 7 ++++- RTCSync.cli/Utils/WindowsTimeUtils.cs | 41 ++++++++++++++++++++------- 3 files changed, 37 insertions(+), 13 deletions(-) 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