gpt4 book ai didi

c++ - 通过代码在 Windows 操作系统上启用和禁用 DST

转载 作者:行者123 更新时间:2023-11-30 19:52:28 25 4
gpt4 key购买 nike

有没有办法通过代码在 Windows 操作系统上启用和禁用 DST(夏令时)?

我一直在遵循下一个 link 中提到的步骤,但没有成功...

此外,我一直在尝试更改 DYNAMIC_TIME_ZONE_INFORMATION 结构的“Bias”属性,它允许我更改日期时间,但不能启用或禁用 DST...

有什么办法可以解决这个问题吗?

下一个源代码仅禁用 DST,但我需要再次启用...

    OpenProcessToken(::GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);

TOKEN_PRIVILEGES tp;
LookupPrivilegeValue(NULL, SE_TIME_ZONE_NAME, &tp.Privileges[0].Luid);
tp.PrivilegeCount = 1;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tp, 0, (PTOKEN_PRIVILEGES)NULL, 0);

DYNAMIC_TIME_ZONE_INFORMATION dyTimeZoneInfo;
ZeroMemory(&dyTimeZoneInfo, sizeof(dyTimeZoneInfo));
DWORD tzId = GetDynamicTimeZoneInformation(&dyTimeZoneInfo);

dyTimeZoneInfo.DynamicDaylightTimeDisabled = !dyTimeZoneInfo.DynamicDaylightTimeDisabled;
dyTimeZoneInfo.DaylightBias = 0;
dyTimeZoneInfo.StandardDate.wDay = 0;
dyTimeZoneInfo.StandardDate.wDayOfWeek = 0;
dyTimeZoneInfo.StandardDate.wHour = 0;
dyTimeZoneInfo.StandardDate.wMilliseconds = 0;
dyTimeZoneInfo.StandardDate.wMinute = 0;
dyTimeZoneInfo.StandardDate.wMonth = 0;
dyTimeZoneInfo.StandardDate.wSecond = 0;
dyTimeZoneInfo.StandardDate.wYear = 0;

dyTimeZoneInfo.DaylightDate.wDay = 0;
dyTimeZoneInfo.DaylightDate.wDayOfWeek = 0;
dyTimeZoneInfo.DaylightDate.wHour = 0;
dyTimeZoneInfo.DaylightDate.wMilliseconds = 0;
dyTimeZoneInfo.DaylightDate.wMinute = 0;
dyTimeZoneInfo.DaylightDate.wMonth = 0;
dyTimeZoneInfo.DaylightDate.wSecond = 0;
dyTimeZoneInfo.DaylightDate.wYear = 0;

SetDynamicTimeZoneInformation(&dyTimeZoneInfo);

tp.Privileges[0].Attributes = NULL;
AdjustTokenPrivileges(hToken, FALSE, &tp, 0, (PTOKEN_PRIVILEGES)NULL, 0);

CloseHandle(hToken);

我将不胜感激任何形式的帮助。

最佳答案

您的原始代码大部分是正确的。我看到的主要问题是:

dyTimeZoneInfo.DynamicDaylightTimeDisabled = !dyTimeZoneInfo.DynamicDaylightTimeDisabled;

切换自动夏令时功能,而其余代码则严格禁用它。相反,将其设置为 true。

dyTimeZoneInfo.DynamicDaylightTimeDisabled = TRUE;

要重新启用 DST,您需要恢复 DaylightBiasDaylightStartStandardStart 字段的原始值。 (不要假设 DaylightBias 始终为 -60,至少有一个为 -30。)

最好只恢复整个 DYNAMIC_TIME_ZONE_INFORMATION 结构。为此,请使用 EnumDynamicTimeZoneInformation 函数迭代系统上的所有时区,并选择 TimeZoneKeyName 与当前时区匹配的时区。

最后,您可能需要考虑为什么需要这样做。通常不再需要通过此机制禁用 DST。这是一个遗留功能。全世界都有适当的时区条目,包括没有夏令时的地区。如果您只是想在自己的应用程序(可能是系统管理应用程序)中模拟操作系统的设置,那么没问题。但对于大多数其他目的,您不需要操纵此设置。

关于c++ - 通过代码在 Windows 操作系统上启用和禁用 DST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55627488/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com