在 Delphi 開發中,判斷某年份是否為閏年是常見需求。SysUtils 和 DateUtils 單元分別提供了 IsLeapYear 和 IsInLeapYear 兩個函數,雖然功能相似,但參數類型不同,適用場景也有所區別。本文將詳細說明這兩個函數的用法、差異以及實戰代碼示例。
TDateTime 日期時間值,內部自動提取年份判斷。| 函數 | 參數類型 | 適用場景 | 備註 |
|---|---|---|---|
| IsLeapYear | Word (年份) | 已知年份整數時 | 無需轉換,效能略高 |
| IsInLeapYear | TDateTime | 手上已有日期變量/字串 | 需引用 DateUtils 單元 |
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses DateUtils; { 必須引用 DateUtils 才能使用 IsInLeapYear }
procedure TForm1.FormCreate(Sender: TObject);
var
b: Boolean;
begin
{ 直接用年份判斷 }
b := IsLeapYear(2009); { False }
b := IsLeapYear(2012); { True }
{ 用日期時間判斷 }
b := IsInLeapYear(StrToDateTime('2009-1-1')); { False }
b := IsInLeapYear(StrToDateTime('2012-1-1')); { True }
{ 可選:顯示結果 }
// ShowMessage(BoolToStr(b, True));
end;
end.
IsInLeapYear 時若未在 uses 子句加入 DateUtils,編譯器會報「Undeclared identifier」。Word 類型支援 0~65535,實際應用建議限制在 1600~9999 之間,避免格里曆改制前的邊界問題。IsLeapYear,避免額外的 TDateTime 解析開銷。若需在不依賴 RTL 的情況下判斷(如跨平台或教學演示),可自行實現:
function IsLeapYearCustom(Y: Word): Boolean;
begin
Result := (Y mod 4 = 0) and ((Y mod 100 <> 0) or (Y mod 400 = 0));
end;
總結:根據手頭資料類型選擇 IsLeapYear 或 IsInLeapYear,注意單元引用,即可輕鬆解決 Delphi 中的閏年判斷需求。