C++ WinRT 如何获取Windows系统标准英文格式的时区ID(TimeZoneId)
解决方案
你需要的不随系统语言变化的英文时区ID(即Windows标准时区标识符,格式为XXX Standard Time),在C++/WinRT中可以通过以下两种稳定方式获取:
方法1:使用WinRT Windows.Globalization API(推荐,适配现代Windows版本)
该方案适配Windows 10 1709及以上版本,直接调用系统原生WinRT接口即可获取恒定英文的时区ID,返回值不会随系统显示语言、区域设置变化。
- 首先引入所需头文件:
#include <winrt/Windows.Globalization.h> - 调用接口获取时区ID:
using namespace winrt::Windows::Globalization; // 返回值即为类似 "Western Standard Time" 的固定英文格式时区ID winrt::hstring timezoneId = TimeZoneSettings::CurrentTimeZoneId(); // 如需转换为std::string传递给Flutter层,可使用以下转换 std::string timezoneIdStr = winrt::to_string(timezoneId);
方法2:使用传统Win32 API(兼容更低Windows版本)
如果需要适配Windows 10 1709以下的系统版本,可以调用Win32的GetDynamicTimeZoneInformation接口获取,其中TimeZoneKeyName字段就是固定英文的标准时区ID:
#include <windows.h> #include <string> std::string GetStandardTimeZoneId() { DYNAMIC_TIME_ZONE_INFORMATION dtzi; DWORD getResult = GetDynamicTimeZoneInformation(&dtzi); if (getResult == TIME_ZONE_ID_INVALID) { return {}; } // TimeZoneKeyName为系统存储的恒定英文时区标识符 char timezoneIdBuf[128] = {0}; WideCharToMultiByte(CP_UTF8, 0, dtzi.TimeZoneKeyName, -1, timezoneIdBuf, sizeof(timezoneIdBuf), nullptr, nullptr); return std::string(timezoneIdBuf); }
注意事项
- 不要使用传统
TIME_ZONE_INFORMATION结构体中的StandardName字段,该字段值会随系统显示语言自动本地化,就是你之前遇到的非英语系统返回当地语言名称的问题。 - 以上两种方法拿到的时区ID和Windows官方定义的标准时区键名完全一致,可直接通过Flutter平台通道传递给上层使用。
内容的提问来源于stack exchange,提问作者Khamidjon Khamidov
相关产品推荐
相关产品推荐

