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

已知时区时如何将TDateTime转换为UTC时间?

问题需求

已知工单中的TDateTime类型时间及对应的时区(如PST/PDT、EST/EDT、CST/CDT、MST/MDT),该时间并非运行代码的计算机本地时间,需要将其转换为UTC时间。原尝试的Delphi代码存在多处报错,需获取可行的实现方案。

原代码问题分析

原代码的核心问题:

  • Delphi的TTimeZone类无法直接识别PST/PDT这类缩写时区ID,它要求传入Windows标准时区名称(如Pacific Standard Time)
  • TTimeZone.Create的参数格式不符合要求,且未处理对象释放,会导致内存泄漏
  • 测试代码直接引用dtpLocal控件,缺乏通用性
可行实现代码

以下代码通过Windows原生时区API实现转换,支持常见时区缩写,自动处理夏令时(DST):

uses
  SysUtils, Windows, DateUtils;

// 映射时区缩写到Windows标准时区ID
function GetWindowsTimeZoneID(const TimeZoneAbbr: string): string;
begin
  if SameText(TimeZoneAbbr, 'PST/PDT') then
    Result := 'Pacific Standard Time'
  else if SameText(TimeZoneAbbr, 'EST/EDT') then
    Result := 'Eastern Standard Time'
  else if SameText(TimeZoneAbbr, 'CST/CDT') then
    Result := 'Central Standard Time'
  else if SameText(TimeZoneAbbr, 'MST/MDT') then
    Result := 'Mountain Standard Time'
  else
    raise Exception.Create('不支持的时区缩写');
end;

// 将指定时区的TDateTime转换为UTC时间
function ConvertToUTC(const LocalDateTime: TDateTime; TimeZoneAbbr: string): TDateTime;
var
  TimeZoneID: string;
  TZI: TTimeZoneInformation;
  LocalSystemTime: TSystemTime;
  UTCSystemTime: TSystemTime;
begin
  TimeZoneID := GetWindowsTimeZoneID(TimeZoneAbbr);
  
  // 获取目标时区信息
  if GetTimeZoneInformationByID(PWideChar(WideString(TimeZoneID)), TZI) = 0 then
    raise Exception.Create('获取时区信息失败');

  // TDateTime转系统时间格式
  DateTimeToSystemTime(LocalDateTime, LocalSystemTime);

  // 转换为UTC时间(自动处理夏令时)
  if not SystemTimeToTzSpecificLocalTime(@TZI, LocalSystemTime, UTCSystemTime) then
    raise Exception.Create('时区转换失败');

  // UTC系统时间转回TDateTime
  Result := SystemTimeToDateTime(UTCSystemTime);
end;

// 测试示例
procedure TestConvertToUTC;
var
  LocalDT, UTCDT: TDateTime;
begin
  // 示例:2024年6月15日 10:00:00(PDT时区,属于PST/PDT)
  LocalDT := EncodeDateTime(2024, 6, 15, 10, 0, 0, 0);
  
  try
    UTCDT := ConvertToUTC(LocalDT, 'PST/PDT');
    Writeln('原时区时间: ', DateTimeToStr(LocalDT));
    Writeln('转换后UTC时间: ', DateTimeToStr(UTCDT));
    // 预期输出:UTC时间为2024-06-15 17:00:00(PDT比UTC晚7小时)
  except
    on E: Exception do
      Writeln('转换错误: ', E.Message);
  end;
end;

begin
  TestConvertToUTC;
  Readln;
end.
代码说明
  • GetWindowsTimeZoneID:将用户传入的时区缩写转换为Windows标准时区ID,确保API能正确识别
  • ConvertToUTC:
    1. 通过GetTimeZoneInformationByID获取目标时区的完整规则(含夏令时)
    2. 完成TDateTime与系统时间格式的互转
    3. 调用SystemTimeToTzSpecificLocalTime完成时区到UTC的转换,自动适配夏令时偏移
  • 测试示例使用硬编码的日期时间,避免依赖UI控件,保证代码可直接运行

内容的提问来源于stack exchange,提问作者Meta Mussel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 14:35:14