【发布时间】:2014-07-29 07:27:50
【问题描述】:
ISO 8601 描述了一种不使用破折号的所谓基本日期格式:
20140507 是更易读的 2014-05-07 的有效表示。
是否有可以解释基本格式并将其转换为 TDateTime 值的 Delphi RTL 函数?
我试过了
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。
【问题讨论】:
-
不确定
RTL是否可以帮助您,但XSBuiltIn可以。它可以使用TXSDatetime轻松转换。在他的blog 上检查@JeroenWiertPluimers 转换单元。 -
TXSDate.XSToNative 针对这种格式抛出 EConvertError 'Invalid argument to date encode'。
-
Indy 的
IdDateTimeStamp.pas似乎也不支持基本日期格式。但@RemyLebeau 或许可以验证这一点。 -
你也应该看看link
-
@dummzeuch,刚刚测试过,你是对的。问题在于它试图提取年、月和日。如果没有某种分隔符,
TXSDate似乎无法这样做。
标签: delphi iso8601 delphi-xe6