Skip to main content

RecodeYear

Function RecodeYear( const AValue : TDateTime; const AYear : Word) : TDateTime

Example​

procedure ScriptEvent(var Value: variant);
var
InputValue: TDateTime;
begin
InputValue := EncodeDateTime(2024, 6, 12, 8, 15, 0, 0);
Value := RecodeYear(InputValue, 2027); // 12 June 2027 08:15
end;

Usage​

RecodeYear replaces the calendar year while preserving the encoded month, day and time.

Parameters

NameTypeDescription
AValueTDateTime, constBase date/time whose month, day and clock fields are retained.
AYearWord, constReplacement year from 1 through 9999, or literal 65535 to preserve the current year.

Returns

A newly encoded TDateTime in the requested year when the retained fields form a valid date/time.

Behaviour

  • Month, day, hour, minute, second and millisecond are preserved.
  • The operation replaces the year field; it does not add a calendar year.
  • Valid pre-epoch inputs are recomposed using Velox's sign-aware encoder.
  • No timezone or calendar-system conversion is performed; Velox uses its proleptic Gregorian range.

Errors

Invalid year/date combinations, invalid base input or encoding failure raise EConvertError. Velox does not catch it. Human-readable error formatting can vary by process locale.

Usage notes

Check leap-day input before changing to a non-leap year if failure is not acceptable. Use IncYear when calendar shifting with Velox's clamping rule is intended.

Additional Technical Info​

RecodeYear replaces the calendar year while retaining the month, day-of-month and time fields. The retained month/day must exist in the requested year.

The example is fictional, deterministic and source-reviewed. It was not executed by the documentation workflow.

Implementation

The DateUtils import binds to System.DateUtils.RecodeYear. The installed wrapper delegates to RecodeDateTime, forwarding AYear and using the internal leave-as-is sentinel for all other fields. The shared path decodes the base and validates the complete replacement through TryEncodeDateTime.

Edge cases and quirks

  • Replacing the year in 29 February with a non-leap year raises. The date is not clamped to 28 February.
  • Literal 65535 preserves the current year. It is a sentinel rather than a valid encodable year.
  • Year zero and years above 9999 (other than the sentinel) are rejected.
  • IncYear differs: it delegates to calendar-month arithmetic and clamps a leap-day result where necessary.
  • Free Pascal documents the same ordinary range; current Velox behaviour follows the installed Delphi implementation.

Side effects

None.

Performance and concurrency

Constant-time decode and encode with no I/O. Successful calculation uses no mutable global state; exception text may use global format settings.

Related entries

  • IncYear shifts by calendar years through month arithmetic.
  • IsInLeapYear tests the base value's year.

External references

Created 2026-07-15