无论用户的本地时区设置为什么,使用Delphi 2007,我都需要确定东部时区的时间(TDateTime)。
我该怎么做?当然,需要时间节省时间。
答案 0 :(得分:11)
如果我理解正确,您希望东部时间等于当前系统时间。
为此,请使用WiNAPI函数GetSystemTime()
以UTC格式获取计算机的当前时间。 UTC与时区无关,总能让您在本初子午线上获得时间。
然后,您可以使用WinAPI函数SystemTimeToTzSpecificLocalTime()
来计算UTC时间内任何其他给定时区的本地时间。为了使SystemTimeToTzSpecificLocalTime()
可以正常工作,您需要为其提供一个TTimeZoneInformation
记录,其中包含您要转换为的时区的正确信息。
根据2005年“能源政策法案”,以下示例将始终为您提供东部时间的当地时间。
function GetEasternTime: TDateTime;
var
T: TSystemTime;
TZ: TTimeZoneInformation;
begin
// Get Current time in UTC
GetSystemTime(T);
// Setup Timezone Information for Eastern Time
TZ.Bias:= 0;
// DST ends at First Sunday in November at 2am
TZ.StandardBias:= 300;
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:= 240;
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;
procedure TForm1.Button1Click(Sender: TObject);
begin
Label1.Caption:= 'In New York Citiy, it is now ' + DateTimeToStr(GetEasternTime);
end;
答案 1 :(得分:3)
TDateTime没有任何时区信息(它只是一个双倍日期作为整数,时间作为十进制),所以你需要单独使用它。你也需要自己的DST逻辑,我不相信Delphi中有任何逻辑。然后使用DateUtils.pas中的IncHour函数将TDateTime更改为Eastern Timezone。
可能有一些Web服务可以帮到您。您的应用程序是否需要自包含,或者它是否可以连接到Web来执行此操作?
答案 2 :(得分:1)
具体来说,TDateTime不是对象,它只是double的别名。