TryStrToDate失败,格式为mmm/yy

Mat*_*aza 2 delphi date delphi-10-seattle

我试图将mmm/yy格式的字符串转换为TDateTime使用该TryStrToDate函数的字符串.然而它似乎总是失败.

我创建一个格式设置记录并设置日期分隔符和短日期格式.我设置了长日期格式,以表明无论是设置短日期还是长日期格式都会出现问题.

如果我改变示例使用dd/mm/yyyy并在2017年1月1日通过然后它成功,所以我相信问题可能是格式.我使用以下链接作为创建格式字符串的参考

http://www.delphibasics.co.uk/RTL.asp?Name=formatdatetime

我制作了一个演示控制台应用程序来展示我想要做的事情的一个例子

uses
   System.SysUtils;

function ValidateDate(ADate: string): boolean;
var
    fs: TFormatSettings;
    DateTime: TDateTime;
begin
    fs := TFormatSettings.Create();
    fs.DateSeparator := '/';
    fs.ShortDateFormat := 'mmm/yy';
    fs.LongDateFormat := 'mmm/yy';

    result := true;
    if not TryStrToDate(ADate, DateTime, fs) then
        result := false;
end;

begin
    try
        if not ValidateDate('Oct/16') then
            WriteLn('Failed to convert')
    except
        on E: Exception do
            Writeln(E.ClassName, ': ', E.Message);
    end;
end.
Run Code Online (Sandbox Code Playgroud)

我会欣赏任何关于为什么失败的想法

Dav*_*nan 7

您的格式字符串无效.这些格式字符串必须编码日,月和年.你省略了不允许的日子.

您为转换提供的字符串允许省略年份.在这种情况下,假设当前年份.

如果您希望将这些字符串转换为仅几个月和一年,那么在您传递给的字符串中包含假日,例如1 TryStrToDate.然后使用DecodeDate获取月份和年份的数值,忽略该日期.

因此,使用'd/mmm/yy'格式并传递'1/' + ADate为要转换的字符串.

另请注意,它是用于将字符串转换为日期的短日期字符串格式,因此这是您需要设置的唯一格式.

最后,这是一种简单的格式,你可以很容易地直接解析它.

更新

正如您所观察到的那样,并在评论中说明,RTL功能是通过ScanDate仅支持数字月份格式的调用实现的.所以,你所尝试的整个方法,遗憾的是注定要失败.即使你解决了我发现的问题.

我的建议是简单地自己解析字符串,因为它的格式非常简单.