1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| //------------------------------------------------------------------------------
class function TSLTISO8601DateTime.TryStringToDate(const S: string; out ADate: TDate; AExtendedFormat: Boolean = True): Boolean;
var
lFormatSettings: TFormatSettings;
SBase: string;
StartPos: Integer;
ReverseRead: PChar;
Year, Month, Day: Word;
ResultD: TDateTime;
begin
Result := False;
ADate := 0;
lFormatSettings := TFormatSettings.Create();
if AExtendedFormat then
begin
lFormatSettings.DateSeparator := SEPARATOR_DATE_EXTENDED;
lFormatSettings.ShortDateFormat := FORMAT_DATE_EXTENDED;
if TryStrToDate(S, ResultD, lFormatSettings) then
begin
ADate := ResultD;
Result := True;
end;
end
else
begin
if Length(S) >= LENGTH_DATE_BASE then
begin
StartPos := 1;
ScanToNumber(S, StartPos);
SBase := Copy(S, StartPos, LENGTH_DATE_BASE);
if Length(SBase) = LENGTH_DATE_BASE then
begin
ReverseRead := PChar(SBase);
Inc(ReverseRead, LENGTH_DATE_BASE);
try
Day := ReadWord(ReverseRead, LENGTH_DATE_DAY_BASE);
Month := ReadWord(ReverseRead, LENGTH_DATE_MONTH_BASE);
Year := ReadWord(ReverseRead, LENGTH_DATE_YEAR_BASE);
if TryEncodeDate(Year, Month, Day, ResultD) then
begin
ADate := ResultD;
Result := True;
end
except
on E: Exception do
{$IFDEF DEBUG_SLT_ISO8601}OutputDebugISO8601('TryStringToDate : ' + E.Message);{$ENDIF DEBUG_SLT_ISO8601}
end;
end;
end;
end;
end; |
Partager