2017-09-24 26 views
-1

Delphi XE6の使用UTCの日付と時刻を米国のタイムゾーンに変換できる必要があります。 今、私は自分のデータベース上のすべての日付時刻と、各タイムゾーンユーザーの番号を持っています。 ESTの場合は5と同じです。UTCの任意のタイムゾーンへの日付と時刻Delphi

私はこれを持っていますが、夏時間に関係なく常に同じ時間を返します。

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

デバッグ時に、どのラインで期待通りにずれていますか?そしてどうやって? –

答えて

2

MSDN Documentationは(省略)TIME_ZONE_INFORMATION構造の興味深いフィールドについて説明します。

TTimeZoneInformationレコードがUTCとの関係で、標準時間と夏時間(DST)を調整するための3つのフィールドがあります:BiasStandardBiasDaylightBiasを。これらの通常の使用法は、UTCとローカル(標準)時間の差を分単位で保持することです。

  • Bias
  • StandardBiasは、標準時間のずれを調整する分数を保持します。これは通常ゼロです。
  • DaylightBiasは、分数を保持し、Biasフィールドに追加され、DST中に使用される総バイアスを形成します。通常これは-60です。
  • あなたのケースでは

あなたが0にBiasフィールドを設定し、(あなたのDBから)時間数とStandardBiasDaylightBiasフィールドを調整しているあなたはまだ余分な60分、F用DaylightBiasを調整する必要があります。例。

TZ.StandardBias:= (HoursToAdd * 60); 

TZ.DaylightBias:= ((HoursToAdd-1) * 60); // note the -1 hour 
関連する問題