Compare commits

...

2 Commits

Author SHA1 Message Date
MuseCat 1fa2075506 Установка времени вручную 2026-06-25 16:32:08 +03:00
MuseCat 8e32e31121 фиксы windows 7 2026-06-25 16:31:44 +03:00
3 changed files with 55 additions and 16 deletions
+19 -4
View File
@@ -9,11 +9,10 @@ namespace RTCSync.Options;
public class SetTimeOption : IOption
{
public string Description =>
"Установка времени как в системе, на часах реального времени. Часы будут хранить локальное время (не UTC!). Можно сбросить время до минимального значения используя опцию \"0\".";
"Без опций устанавливается время как в системе, в локальный формат (не UTC). Дату и время можно задать вручную в кавычках. Опция \"0\" сбрасывает время на минимальное значение.";
public List<string> OptionNames => ["-s", "--set-time"];
public string OptionValues => "[0]";
public string OptionValues => "{\"HH:mm:ss dd.MM.yyyy\", 0}";
public void Execute(OptionArgs args)
@@ -48,12 +47,28 @@ public class SetTimeOption : IOption
DeviceWriters.SetTime(device, dt);
}
}
else if (value != null && value != "")
{
for (var i = 0; i < 3; i++)
{
try
{
var dt = DateTime.Parse(value);
DeviceWriters.SetTime(device, dt);
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
}
}
else
{
for (var i = 0; i < 3; i++)
{
// FIXME: вызывает падение на windows 7
var dt = DateTime.Now;
var dt = WindowsTimeUtils.Now();
DeviceWriters.SetTime(device, dt);
}
}
+6 -1
View File
@@ -7,12 +7,17 @@
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<PublishAot>true</PublishAot>
<TrimMode>link</TrimMode>
<TrimmerSingleWarn>false</TrimmerSingleWarn>
<InvariantGlobalization>true</InvariantGlobalization>
<RootNamespace>RTCSync</RootNamespace>
<IlcOptimizationPreference>Size</IlcOptimizationPreference>
<IlcDisableReflection>true</IlcDisableReflection>
<OptimizationPreference>Speed</OptimizationPreference>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="LibUsbDotNet" Version="3.0.224" />
<PackageReference Include="LibUsbDotNet" Version="3.0.224"/>
</ItemGroup>
</Project>
+30 -11
View File
@@ -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();
}
}