使用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;
感谢您的帮助。
答案 0 :(得分:2)
MSDN Documentation解释了TIME_ZONE_INFORMATION
结构(缩写)的有趣字段:
TTimeZoneInformation
记录包含3个字段,用于调整与UTC相关的标准时间和夏令时(DST):Bias
,StandardBias
和DaylightBias
。这些的正常用法是
Bias
保持UTC与本地(标准)时间之间的分钟差异。 StandardBias
保留在标准时间内调整偏差的分钟数。这通常是零。DaylightBias
保留分钟数,并添加到Bias
字段,以形成在夏令时期间使用的总偏差。通常这是-60。如果您将Bias
字段设置为0并使用小时数(来自数据库)调整StandardBias
和DaylightBias
字段,则仍需要调整额外的60分钟DaylightBias
,f.ex。
TZ.StandardBias:= (HoursToAdd * 60);
TZ.DaylightBias:= ((HoursToAdd-1) * 60); // note the -1 hour