gpt4 book ai didi

delphi - 是否有 Delphi RTL 函数可以将 ISO 8601 基本日期格式转换为 TDate?

转载 作者:行者123 更新时间:2023-12-03 15:32:45 26 4
gpt4 key购买 nike

ISO 8601 描述了一种不使用破折号的所谓基本日期格式:

20140507 是更具可读性的 2014-05-07 的有效表示。

是否有 Delphi RTL 函数可以解释该基本格式并将其转换为 TDateTime 值?

我试过了

function TryIso2Date(const _s: string; out _Date: TDateTime): Boolean;
var
Settings: TFormatSettings;
begin
Settings := GetUserDefaultLocaleSettings;
Settings.DateSeparator := #0;
Settings.ShortDateFormat := 'yyyymmdd';
Result := TryStrToDate(_s, Date, Settings);
end;

TryIso2Date('20140507', dt);

但它不起作用,因为在字符串中找不到 DateSeparator。

到目前为止,我想到的唯一解决方案(除了自己编写解析代码之外)是在调用 TryStrToDate 之前添加缺少的破折号:

function TryIso2Date(const _s: string; out _Date: TDateTime): Boolean;
var
Settings: TFormatSettings;
s: string;
begin
Settings := GetUserDefaultLocaleSettings;
Settings.DateSeparator := #0;
Settings.ShortDateFormat := 'yyyy-mm-dd';
s := Copy(_s,1,4) + '-' + Copy(_s, 5,2) + '-' + Copy(_s, 7);
Result := TryStrToDate(_s, Date, Settings);
end;

TryIso2Date('20140507', dt);

这可行,但感觉相当笨拙。

这是 Delphi XE6,因此它应该具有最新的 RTL。

最佳答案

您可以像以前一样使用Copy 提取值。然后你只需要对日期进行编码:

function TryIso8601BasicToDate(const Str: string; out Date: TDateTime): Boolean;
var
Year, Month, Day: Integer;
begin
Assert(Length(Str)=8);
Result := TryStrToInt(Copy(Str, 1, 4), Year);
if not Result then
exit;
Result := TryStrToInt(Copy(Str, 5, 2), Month);
if not Result then
exit;
Result := TryStrToInt(Copy(Str, 7, 2), Day);
if not Result then
exit;
Result := TryEncodeDate(Year, Month, Day, Date);
end;

关于delphi - 是否有 Delphi RTL 函数可以将 ISO 8601 基本日期格式转换为 TDate?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24108718/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com