[fpc-pascal] How to convert ISO format string in FreePascal
Graeme Geldenhuys
graemeg.lists at gmail.com
Tue Apr 27 20:54:56 CEST 2010
On 27 April 2010 17:43, Frank Church <vfclists at googlemail.com> wrote:
> I want to convert a time stamp in yyyy-mm-dd hh:mm:ss format to a
> TDatetime in FPC but can't find but haven't found a way yet.
I have written the following for the tiOPF project and us it in our
company projects for all date/time values (including storage in
database fields).
See attached file for the relevant functions. The code has been some
unit tests as well, and can be found in the tiOPF testing framework.
tiOPF is hosted on SourceForge.
NOTE:
I do not manage weeks or timezone information in the ISO 8601 standard.
Some constants I forgot to add to the txt file.
{ Summary of ISO 8601 http://www.cl.cam.ac.uk/~mgk25/iso-time.html }
cIntlDateTimeStor = 'yyyymmdd"T"hhmmss'; // for storage
cIntlDateTimeDisp = 'yyyy-mm-dd hh:mm:ss'; // for display
CIntlDateDisp = 'yyyy-mm-dd'; // for display
--
Regards,
- Graeme -
_______________________________________________
fpGUI - a cross-platform Free Pascal GUI toolkit
http://opensoft.homeip.net/fpgui/
-------------- next part --------------
// Seaches <sStr> and replaces <sDel> with <sIns>
// Case sensitive.
function tiStrTran(AValue, ADel, AIns : string): string;
var
i : integer;
sToChange : string;
begin
result := '';
sToChange := AValue;
i := pos(ADel, sToChange);
while i <> 0 do begin
result := result + copy(sToChange, 1, i-1) + AIns;
delete(sToChange, 1, i+length(ADel)-1);
i := pos(ADel, sToChange);
end;
result := result + sToChange;
end;
function tiDateTimeAsIntlDateStor(const ADateTime: TDateTime): string;
begin
Result := FormatDateTime(cIntlDateTimeStor, ADateTime);
if Pos('18991230', Result) = 1 then
Result := tiStrTran(Result, '18991230', '00000000');
end;
function tiDateTimeAsIntlDateDisp(const ADateTime: TDateTime): string;
begin
Result := FormatDateTime(cIntlDateTimeDisp, ADateTime);
if Pos('1899-12-30', Result) = 1 then
Result := tiStrTran(Result, '1899-12-30', '0000-00-00');
end;
function tiDateAsIntlDateDisp(const ADateTime: TDateTime): string;
begin
Result := FormatDateTime(CIntlDateDisp, ADateTime);
if Pos('1899-12-30', Result) = 1 then
Result := tiStrTran(Result, '1899-12-30', '0000-00-00');
end;
function tiIntlDateStorAsDateTime(const AValue: string): TDateTime;
var
lY, lM, lD, lH, lMi, lS: Word;
begin
if Trim(AValue) = '' then
begin
Result := 0;
Exit; //==>
end;
// 1 2
// 12345678901234567890123
// yyyymmddThhmmss
lY := StrToInt(Copy(AValue, 1, 4));
lM := StrToInt(Copy(AValue, 5, 2));
lD := StrToInt(Copy(AValue, 7, 2));
lH := StrToInt(Copy(AValue, 10, 2));
lMi := StrToInt(Copy(AValue, 12, 2));
lS := StrToInt(Copy(AValue, 14, 2));
{ Cannot EncodeDate if any part equals 0. EncodeTime is okay. }
if (lY = 0) or (lM = 0) or (lD = 0) then
Result := EncodeTime(lH, lMi, lS, 0)
else
Result := EncodeDate(lY, lM, lD) + EncodeTime(lH, lMi, lS, 0);
end;
function tiIntlDateDispAsDateTime(const AValue: string): TDateTime;
var
lY, lM, lD, lH, lMi, lS: Word;
begin
if Trim(AValue) = '' then
begin
Result := 0;
Exit; //==>
end;
// 1 2
// 12345678901234567890123
// yyyy-mm-dd hh:mm:ss
lY := StrToInt(Copy(AValue, 1, 4));
lM := StrToInt(Copy(AValue, 6, 2));
lD := StrToInt(Copy(AValue, 9, 2));
lH := StrToInt(Copy(AValue, 12, 2));
lMi := StrToInt(Copy(AValue, 15, 2));
lS := StrToInt(Copy(AValue, 18, 2));
{ Cannot EncodeDate if any part equals 0. EncodeTime is okay. }
if (lY = 0) or (lM = 0) or (lD = 0) then
Result := EncodeTime(lH, lMi, lS, 0)
else
Result := EncodeDate(lY, lM, lD) + EncodeTime(lH, lMi, lS, 0);
end;
More information about the fpc-pascal
mailing list