在UWP C++ WinRT中能否以编程方式设置系统时区、日期和时间?
UWP C++/WinRT 修改系统时区、日期时间问题解决方案
UWP WinRT本身支持该功能,TimeZoneSettings::CanChangeTimeZone()始终返回false是存在遗漏配置和场景限制问题,具体解决方法如下:
1. 检查AppxManifest命名空间配置是否完整
仅声明systemManagement能力不生效,必须在清单根节点补充iot命名空间声明,完整配置示例如下:
<Package xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10" xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10" xmlns:iot="http://schemas.microsoft.com/appx/manifest/iot/windows10" IgnorableNamespaces="uap iot"> <!-- 其他应用配置 --> <Capabilities> <iot:Capability Name="systemManagement"/> </Capabilities> </Package>
注意systemManagement属于受限能力,仅允许企业侧旁加载应用使用,提交到微软商店的应用无法通过审核。
2. 注意API的适用场景限制
TimeZoneSettings、DateTimeSettings这组修改系统时间时区的API,原生是为Windows IoT Core设备设计的,默认仅在IoT设备环境下生效:
- 如果你是在普通桌面Windows 10/11上调试运行,哪怕配置了权限和本地策略,UWP沙箱也会默认拦截该操作,返回
CanChangeTimeZone() = false - 桌面场景要实现该功能,建议改用桌面桥打包方案,在桌面进程中调用Win32 API
SetTimeZoneInformation、SetSystemTime实现,限制更少兼容性更好
3. IoT场景下的额外校验
如果是部署到Windows IoT Core设备,确认完清单配置后,还要验证:
- 设备已经开启开发者模式
- 应用是旁加载部署,不是从商店安装的版本
- 本地用户的更改时区、更改系统时间权限配置无误
完成上述配置后,TimeZoneSettings::CanChangeTimeZone()会正常返回true,可正常调用修改时区的接口。
内容的提问来源于stack exchange,提问作者sohel14_cse_ju
相关产品推荐
相关产品推荐

