【问题标题】:UTC Date and Time to any timezone DelphiUTC 日期和时间到任何时区 Delphi
【发布时间】:2018-03-05 16:34:12
【问题描述】:

使用德尔福 XE6。我需要能够将 UTC 日期和时间转换为任何美国时区。 现在,我的数据库中有所有 UTC 日期时间加上每个时区用户的数字。比如 5 代表 EST。

我有这个,但不管夏令时如何,它总是给我同样的时间。

function SendRouteOnCallNotify.GetMyLocalTime(UTCDate,UTCTime: TDateTime; HoursToAdd: Integer): TDateTime;
var
  T: TSystemTime;
  TZ: TTimeZoneInformation;
  DT: TDateTime;
begin
  // Get Current time in UTC
  //GetSystemTime(T);
  ReplaceTime(UTCDate,UTCTime);
  DateTimeToSystemTime(UTCDate,T);
  // Setup Timezone Information for Eastern Time
  TZ.Bias:= 0;

  // DST ends at First Sunday in November at 2am
  TZ.StandardBias:= (HoursToAdd * 60);
  TZ.StandardDate.wYear:= 0;
  TZ.StandardDate.wMonth:= 11; // November
  TZ.StandardDate.wDay:= 1; // First
  TZ.StandardDate.wDayOfWeek:= 0; // Sunday
  TZ.StandardDate.wHour:= 2;
  TZ.StandardDate.wMinute:= 0;
  TZ.StandardDate.wSecond:= 0;
  TZ.StandardDate.wMilliseconds:= 0;

  // DST starts at Second Sunday in March at 2am
  TZ.DaylightBias:= (HoursToAdd * 60);
  TZ.DaylightDate.wYear:= 0;
  TZ.DaylightDate.wMonth:= 3; // March
  TZ.DaylightDate.wDay:= 2; // Second
  TZ.DaylightDate.wDayOfWeek:= 0; // Sunday
  TZ.DaylightDate.wHour:= 2;
  TZ.DaylightDate.wMinute:= 0;
  TZ.DaylightDate.wSecond:= 0;
  TZ.DaylightDate.wMilliseconds:= 0;

  // Convert UTC to Eastern Time
  Win32Check(SystemTimeToTzSpecificLocalTime(@TZ, T, T));

  // Convert to and return as TDateTime
  Result := EncodeDate(T.wYear, T.wMonth, T.wDay) +
   EncodeTime(T.wHour, T.wMinute, T.wSecond, T.wMilliSeconds);
end;

感谢您的帮助。

【问题讨论】:

  • 你调试的时候,在哪一行偏离了你的预期?以及如何?

标签: delphi datetime utc delphi-xe6


【解决方案1】:

MSDN Documentation 解释了TIME_ZONE_INFORMATION 结构(缩写)的有趣字段:

TTimeZoneInformation 记录有 3 个字段用于调整与 UTC 相关的标准时间和夏令时 (DST):BiasStandardBiasDaylightBias。这些的正常用法是

  • Bias 保存 UTC 和本地(标准)时间之间的分钟差。
  • StandardBias 保存在标准时间内调整偏差的分钟数。这通常为零。
  • DaylightBias 保存分钟数并添加到 Bias 字段以形成 DST 期间使用的总偏差。通常为 -60。

当您将 Bias 字段设置为 0 并使用小时数(来自您的数据库)调整 StandardBiasDaylightBias 字段时,您仍然需要调整 DaylightBias 以获得额外的60 分钟,前 5 分钟。

TZ.StandardBias:= (HoursToAdd * 60);

TZ.DaylightBias:= ((HoursToAdd-1) * 60); // note the -1 hour

【讨论】:

    猜你喜欢
    • 2023-03-10
    • 2011-08-10
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-15
    • 2012-11-17
    • 1970-01-01
    相关资源
    最近更新 更多