You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++ WinRT 如何获取Windows系统标准英文格式的时区ID(TimeZoneId)

解决方案

你需要的不随系统语言变化的英文时区ID(即Windows标准时区标识符,格式为XXX Standard Time),在C++/WinRT中可以通过以下两种稳定方式获取:

方法1:使用WinRT Windows.Globalization API(推荐,适配现代Windows版本)

该方案适配Windows 10 1709及以上版本,直接调用系统原生WinRT接口即可获取恒定英文的时区ID,返回值不会随系统显示语言、区域设置变化。

  1. 首先引入所需头文件:
    #include <winrt/Windows.Globalization.h>
  2. 调用接口获取时区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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 18:54:02