gpt4 book ai didi

Delphi - 相当于需要 C# DateTime.IsDaylightSavingTime() 方法

转载 作者:行者123 更新时间:2023-12-03 14:48:16 24 4
gpt4 key购买 nike

我需要以某种方式确定某个 TDateTime 值是否在我的时区的夏令时范围内(在 C# 中,DateTime.IsDaylightSavingTime() 也是如此) > 方法)。

我知道在 Delphi 中没有类似的函数,因为 Delphi TDateTime 不包含有关时区的信息,但我想有一些方法可以使用 Win32 API 来做到这一点。

我已经查看了 Win32 API GetTimeZoneInformationGetTimeZoneInformationForYear 函数,但我不太明白如何使用它们,所以我想向您询问帮助。预先感谢您提供任何提示。

编辑:

示例:

在我的时区(中欧),夏令时于今年开始3月28日凌晨2点至2010年10月31日凌晨3点结束。

我需要一个带标题的函数:

function IsDaylightSavingTime(input: TDateTime): boolean;

如果输入日期在 2010 年 3 月 28 日 2:00 到 2010 年 10 月 31 日 3:00 之间,则返回 true,否则返回 false

(该示例仅适用于 2010 年,但我需要它在所有年份都有效。)

再一次,我知道仅保存在 TDateTime 中的信息是不够的,但我认为通过一些 Win32 API 函数我应该能够获得例如Windows 设置中有关当前时区的信息。

最佳答案

这并不像听起来那么容易,因为:

1) 夏令时和标准时间之间的切换日期对于所有国家来说并不相同

2) 对于同一国家/地区,所有年份的 DST 和标准时间之间的切换日期的算法并不相同(例如,在中欧,以前是四月的第一个星期日,IIRC,现在是三月的最后一个星期日) )。美国从2007年起从4月的第一个星期日改为3月的第二个星期日。

所以 - 一个简单的日期是不够的,您还需要一个地理位置。

但是,如果您能接受这样一个事实,那就是您将自己限制在可以通过 CURRENT 算法计算出的CURRENT年份的切换日期当前区域设置(国家/地区),并且这对于 future 和过去的日期可能都是错误的,那么您可以使用 TIME_ZONE_INFORMATION 中的信息来计算切换日期:

USES Windows,SysUtils,DateUtils;

FUNCTION GetDaylightSavingsSwitchOverDates(Year : Cardinal ; VAR Start,Stop : TDateTime) : BOOLEAN;

VAR
TZ : TTimeZoneInformation;

FUNCTION DecodeSwitchOverDate(Year : Cardinal ; CONST Time : TSystemTime) : TDateTime;
VAR
I : Cardinal;

BEGIN
Result:=EncodeDateTime(Year,Time.wMonth,1,Time.wHour,Time.wMinute,Time.wSecond,0);
IF Time.wDay=5 THEN BEGIN
Result:=DateOf(EndOfTheMonth(Result))+TimeOf(Result);
WHILE PRED(DayOfWeek(Result))<>Time.wDayOfWeek DO
Result:=IncDay(Result,-1)
END
ELSE BEGIN
WHILE PRED(DayOfWeek(Result))<>Time.wDayOfWeek DO Result:=IncDay(Result);
FOR I:=1 TO PRED(Time.wDay) DO Result:=IncWeek(Result)
END
END;

BEGIN
IF GetTimeZoneInformation(TZ)=TIME_ZONE_ID_UNKNOWN THEN
Result:=FALSE
ELSE BEGIN
Start:=DecodeSwitchOverDate(Year,TZ.DaylightDate);
Stop:=DecodeSwitchOverDate(Year,TZ.StandardDate);
Result:=TRUE
END
END;

FUNCTION StartOfDST(Year : Cardinal) : TDateTime;
VAR
Stop : TDateTime;

BEGIN
IF NOT GetDaylightSavingsSwitchOverDates(Year,Result,Stop) THEN Result:=0
END;

FUNCTION EndOfDST(Year : Cardinal) : TDateTime;
VAR
Start : TDateTime;

BEGIN
IF NOT GetDaylightSavingsSwitchOverDates(Year,Start,Result) THEN Result:=0
END;

在我的电脑(中欧时区)上循环 2000 年到 2020 年,我得到以下日期:

DST in 2000: Sun 26 Mar 2000 02:00:00 through Sun 29 Oct 2000 03:00:00
DST in 2001: Sun 25 Mar 2001 02:00:00 through Sun 28 Oct 2001 03:00:00
DST in 2002: Sun 31 Mar 2002 02:00:00 through Sun 27 Oct 2002 03:00:00
DST in 2003: Sun 30 Mar 2003 02:00:00 through Sun 26 Oct 2003 03:00:00
DST in 2004: Sun 28 Mar 2004 02:00:00 through Sun 31 Oct 2004 03:00:00
DST in 2005: Sun 27 Mar 2005 02:00:00 through Sun 30 Oct 2005 03:00:00
DST in 2006: Sun 26 Mar 2006 02:00:00 through Sun 29 Oct 2006 03:00:00
DST in 2007: Sun 25 Mar 2007 02:00:00 through Sun 28 Oct 2007 03:00:00
DST in 2008: Sun 30 Mar 2008 02:00:00 through Sun 26 Oct 2008 03:00:00
DST in 2009: Sun 29 Mar 2009 02:00:00 through Sun 25 Oct 2009 03:00:00
DST in 2010: Sun 28 Mar 2010 02:00:00 through Sun 31 Oct 2010 03:00:00
DST in 2011: Sun 27 Mar 2011 02:00:00 through Sun 30 Oct 2011 03:00:00
DST in 2012: Sun 25 Mar 2012 02:00:00 through Sun 28 Oct 2012 03:00:00
DST in 2013: Sun 31 Mar 2013 02:00:00 through Sun 27 Oct 2013 03:00:00
DST in 2014: Sun 30 Mar 2014 02:00:00 through Sun 26 Oct 2014 03:00:00
DST in 2015: Sun 29 Mar 2015 02:00:00 through Sun 25 Oct 2015 03:00:00
DST in 2016: Sun 27 Mar 2016 02:00:00 through Sun 30 Oct 2016 03:00:00
DST in 2017: Sun 26 Mar 2017 02:00:00 through Sun 29 Oct 2017 03:00:00
DST in 2018: Sun 25 Mar 2018 02:00:00 through Sun 28 Oct 2018 03:00:00
DST in 2019: Sun 31 Mar 2019 02:00:00 through Sun 27 Oct 2019 03:00:00
DST in 2020: Sun 29 Mar 2020 02:00:00 through Sun 25 Oct 2020 03:00:00

但这些年份中至少有一些是不正确的,因为算法在列出的年份中从我的区域设置发生了变化。

你的函数将是:

FUNCTION IsDaylightSavingTime(Input : TDateTime) : BOOLEAN;
VAR
Start,Stop : TDateTime;

BEGIN
Result:=GetDaylightSavingsSwitchOverDates(YearOf(Input),Start,Stop) AND (Input>=Start) AND (Input<Stop)
END;

关于Delphi - 相当于需要 C# DateTime.IsDaylightSavingTime() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3448983/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com