Ich würde das ganz banal angehen. Eine Klasse mit 2 Properties "FromDateTime" und "ToDateTime", und einer Sammlung an Methoden. Alternativ eine Klasse mit 3 Datums-Properties und Read-Only Properties, die auf entsprechende Getter verweisen. Die verschiedenen Methoden/Getter ließen sich auch noch durch einen Enum ersetzen, und einer generellen "GetRange"-Methode.
Delphi-Quellcode:
type
TDateTimeRange = class(TObject)
private
FFromTime, FToTime: TDateTime;
public
property FromTime: TDateTime read FFromTime;
property ToTime: TDateTime read FToTime;
function GetYearRange(relativeTo: TDateTime): TDateTimeRange;
function GetMonthRange(relativeTo: TDateTime): TDateTimeRange;
function GetDayRange(relativeTo: TDateTime): TDateTimeRange;
// etc.
end;
// oder
TDateTimeRange = class(TObject)
private
FFromTime, FToTime, FRelativeTime: TDateTime;
function GetYearRange: TDateTimeRange;
function GetMonthRange: TDateTimeRange;
function GetDayRange: TDateTimeRange;
public
constructor Create(aRelativeTime: TDateTime);
property FromTime: TDateTime read FFromTime;
property ToTime: TDateTime read FToTime;
property RelativeTime: TDateTime read FRelativeTime write FRelativeTime;
property YearRange: TDateTimeRange read GetYearRange;
property MonthRange: TDateTimeRange read GetMonthRange;
property DateRange: TDateTimeRange read GetDateRange;
// etc.
end;
// ooooder:
TDateTimeRangeMode = (dtrmYear, dtrmMonth, dtrmDay);
TDateTimeRange = class(TObject)
private
FFromTime, FToTime, FRelativeTime: TDateTime;
FRangeMode: TDateTimeRangeMode;
function GetRange: TDateTimeRange;
public
constructor Create(aRelativeTime: TDateTime; aRangeMode: TDateTimeRangeMode);
property FromTime: TDateTime read FFromTime;
property ToTime: TDateTime read FToTime;
property RelativeTime: TDateTime read FRelativeTime write FRelativeTime;
property Range: TDateTimeRange read GetRange;
end;
Darin ließe sich auch noch statisch eine Factory einbauen, die etwas wie
TDateTimeRange.CreateNewRange(aRelativeTime: TDateTime; aRangeMode: TDateTimeRangeMode): TDateTimeRange;
bietet, wodurch sich das Problem etwas mildert, dass solche Konstrukte wie oben in nicht-GC Umgebungen ggf. doof zu handhaben sind.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)