# Date/Time Routines - Delphi Programming

Compares two TDateTime values (returns "less", "equal" or "greater"). Ignores the Time part if both values "fall" on the same day.

### CompareDateTime function

Compares two TDateTime values (returns "less", "equal" or "greater").

Declaration:
type TValueRelationship = -1..1
function CompareDateTime(const ADate, BDate: TDateTime) : TValueRelationship

Description:
Compares two TDateTime values (returns "less", "equal" or "greater").

TValueRelationship represents the relationship between two values. Each of three TValueRelationship values has a "liked" symbolic constant:
-1 [LessThanValue] The first value is less than the second value.
0 [EqualsValue] The two values are equal.
1 [GreaterThanValue] The first value is greater than the second value.

CompareDate results in:

LessThanValue if ADate is earlier than BDate.
EqualsValue if date and time parts of both ADate and BDate are the same
GreaterThanValue if ADate is later than BDate.

Example:

```var ThisMoment, FutureMoment : TDateTime;
ThisMoment := Now;
FutureMoment := IncDay(ThisMoment, 6); //adds 6 days
//CompareDateTime(ThisMoment, FutureMoment) returns LessThanValue (-1)
//CompareDateTime(FutureMoment, ThisMoment) returns GreaterThanValue (1)```

### CompareTime function

Compares two TDateTime values (returns "less", "equal" or "greater"). Ignores the Date part if both values occur at the same time.

Declaration:
type TValueRelationship = -1..1
function CompareDate(const ADate, BDate: TDateTime) : TValueRelationship

Description:
Compares two TDateTime values (returns "less", "equal" or "greater"). Ignores the Time part if both values occur at the same time.

TValueRelationship represents the relationship between two values.

Each of three TValueRelationship values has a "liked" symbolic constant:
-1 [LessThanValue] The first value is less than the second value.
0 [EqualsValue] The two values are equal.
1 [GreaterThanValue] The first value is greater than the second value.

CompareDate results in:

LessThanValue if ADate occurs earlier in the day specified by BDate.
EqualsValue if time parts of both ADate and BDate are the same, ignoring the Date part.
GreaterThanValue if ADate occurs later in the day specified by BDate.

Example:

```var ThisMoment, AnotherMoment : TDateTime;
ThisMoment := Now;
AnotherMoment := IncHour(ThisMoment, 6); //adds 6 hours
//CompareDate(ThisMoment, AnotherMoment) returns LessThanValue (-1)
//CompareDate(AnotherMoment, ThisMoment) returns GreaterThanValue (1```

### Date function

Returns the current system date.

Declaration:
type TDateTime = type Double;

function date: TDateTime;

Description:
Returns the current system date.

The integral part of a TDateTime value is the number of days that have passed since 12/30/1899. The fractional part of a TDateTime value is fraction of a 24 hour day that has elapsed.

To find the fractional number of days between two dates, simply subtract the two values. Likewise, to increment a date and time value by a certain fractional number of days, simply add the fractional number to the date and time value.

Example:   ShowMessage('Today is ' + DateToStr(Date));

### DateTimeToStr function

Converts a TDateTime value to a string (date and time).

Declaration:
type
TDateTime = type Double;

function DayOfWeek(Date: TDateTime): integer;

Description:
Returns the day of the week for a given date.

DayOfWeek returns an integer between 1 and 7, where Sunday is the first day of the week and Saturday is the seventh.
DayOfTheWeek is not compliant with the ISO 8601 standard.

Example:

```const Days: array[1..7] of string =
('Sunday', 'Monday', 'Tuesday',
'Wednesday', 'Thursday',
'Friday', 'Saturday')
ShowMessage('Today is ' + Days[DayOfWeek(Date)]);
//Today is Monday```

### DaysBetween function

Gives the number of whole days between two specified dates.

Declaration:
function
DaysBetween(const ANow, AThen: TDateTime): Integer;

Description:
Gives the number of whole days between two specified dates.

Function counts only whole days. What this means is that it will return 0 as the result for difference between 05/01/2003 23:59:59 and 05/01/2003 23:59:58 - where the actual difference is one *whole* day minus 1 second.

Example:

```var dtNow, dtBirth : TDateTime;
DaysFromBirth : integer;
dtNow := Now;
dtBirth := EncodeDate(1973, 1, 29);
DaysFromBirth := DaysBetween(dtNow, dtBirth);
ShowMessage('Zarko Gajic "exists" ' +
IntToStr(DaysFromBirth) + ' whole days!'); ```

### DateOf function

Returns only the Date portion of the TDateTime value, by setting Time part to 0.

Declaration:
function
DateOf(Date: TDateTime) : TDateTime

Description:
Returns only the Date portion of the TDateTime value, by setting Time part to 0.

DateOf sets the time portion to 0, which means midnight.

Example:

```var ThisMoment, ThisDay : TDateTime;
ThisMoment := Now; // -> 06/27/2003 10:29:16:138
ThisDay := DateOf(ThisMoment);
//This Day:= 06/27/2003 00:00:00:000```

### DecodeDate function

Separates Year, Month, and Day values from a TDateTime value.

Declaration:
procedure
DecodeDate(Date: TDateTime; var Year, Month, Day: Word);;

Description:
Separates Year, Month, and Day values from a TDateTime value.

If the given TDateTime value is less than or equal to zero, the year, month, and day return parameters are all set to zero.

Example:

 ```var Y, M, D: Word; DecodeDate(Date, Y, M, D); if Y = 2000 then ShowMessage('You''re in a "wrong" century!);```

EncodeDate function
Creates a TDateTime value from Year, Month, and Day values.

Declaration:
function
EncodeDate(Year, Month, Day: Word): TDateTime

Description:
Creates a TDateTime value from Year, Month, and Day values.

The Year must be between 1 and 9999. Valid Month values are 1 through 12. Valid Day values are 1 through 28, 29, 30, or 31, depending on the Month value.
If the function fails, EncodeDate raises an EConvertError exception.

Example:

```var Y, M, D: Word;
dt: TDateTime;
y:=2001;
M:=2;
D:=18;
dt:=EncodeDate(Y,M,D);
ShowMessage('Borna will be
one year old on ' + DateToStr(dt))```

FormatDateTime function
Formats a TDateTime value to a string.

Declaration:
function
FormatDateTime(const Fmt: string; Value: TDateTime): string;

Description:
Formats a TDateTime value to a string.

FormatDateTime uses the format specified by the Fmt parameter. For the supported format specifiers go see Delphi Help files.

Example:

```var s: string;
d: TDateTime;
...
d:=Now; // today + current time
s:=FormatDateTime('dddd',d);
// s:=Wednesday
s:=FormatDateTime('"Today is " dddd " minute " nn',d)
// s:=Today is Wednesday minute 24```

### IncDay function

Adds or substracts a given number of days from a date value.

Declaration:
function
IncDay(ADate: TDateTime; Days: Integer = 1) : TDateTime;

Description:
Adds or substracts a given number of days from a date value.

If the Days parameter is negative the date returned is < ADate. The Time part of day specified by the Date parameter is copied to the result.

Example:

```var Date: TDateTime;
EncodeDate(Date, 2003, 1, 29) //January 29, 2003
IncDay(Date, -1)
//January 28, 2003```

### Now function

Returns the current system date and time.

Declaration:
type
TDateTime = type Double;

function Now: TDateTime;

Description:
Returns the current system date and time.

The integral part of a TDateTime value is the number of days that have passed since 12/30/1899. The fractional part of a TDateTime value is fraction of a 24 hour day that has elapsed.

To find the fractional number of days between two dates, simply subtract the two values. Likewise, to increment a date and time value by a certain fractional number of days, simply add the fractional number to the date and time value.

Example:  ShowMessage('Now is ' + DateTimeToStr(Now));

### YearsBetween function

Gives the number of whole years between two specified dates.

Declaration:
function
YearsBetween(const SomeDate, AnotherDate: TDateTime): Integer;

Description:
Gives the number of whole years between two specified dates.

YearsBetween returns an approximation based on an assumption of 365.25 days per year.

Example:

```var dtSome, dtAnother : TDateTime;
DaysFromBirth : integer;
dtSome := EncodeDate(2003, 1, 1);
dtAnother := EncodeDate(2003, 12, 31);
YearsBetween(dtSome, dtAnother) == 1 //non-leap year
dtSome := EncodeDate(2000, 1, 1);
dtAnother := EncodeDate(2000, 12, 31);
YearsBetween(dtSome, dtAnother) == 0 // leap year```