UTC日期和时间到任何时区德尔福

时间:2017-09-24 17:19:29

标签: delphi datetime utc delphi-xe6

使用Delphi 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;

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

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

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

  • Bias保持UTC与本地(标准)时间之间的分钟差异。
  • StandardBias保留在标准时间内调整偏差的分钟数。这通常是零。
  • DaylightBias保留分钟数,并添加到Bias字段,以形成在夏令时期间使用的总偏差。通常这是-60。

如果您将Bias字段设置为0并使用小时数(来自数据库)调整StandardBiasDaylightBias字段,则仍需要调整额外的60分钟DaylightBias,f.ex。

TZ.StandardBias:= (HoursToAdd * 60);

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