如何检查TDateTime内容是否有效

问题描述 投票:2回答:3

有没有一种方法可以检查Delphi TDateTime变量是否具有有效内容,而不会在转换时捕获异常?

我已经编写了一个应用程序,该应用程序必须解析成百个巨大的文件,这些文件被编写为包含TDateTime字段的原始Delphi记录。有时,我得到一条记录,其中的内容具有TDateTime值,如2.0927117954e + 262,该值在传递给转换例程时会给出Floating point invalid Operation异常。我知道我可以简单地捕获该异常,但这在调试时非常麻烦,因为调试器不断停止,并且我想在其他错误的情况下保持启用状态。

delphi validation datetime vcl tdatetime
3个回答
11
投票

您的示例值显然超出有效的DateTime范围。您可以在执行任何转换之前测试它是否在范围内。

var
  d: TDateTime;
..

d := 2.0927117954e+262;
if (d <= MaxDateTime) and (d >= MinDateTime) then
  s := DateTimeToStr(d)
else
  ..

5
投票

如果您的问题是调试器停止,则可以在更高Delphi版本的IDE中进行修复。在发生异常的行的前后设置两个断点。例如。在Delphi 2007中,右键单击第一个BP的空白红点,选择BreakPoint属性/高级/忽略后续异常。在第二个BP上,“处理后续异常”


4
投票

VCL函数System.SysUtils.TryFloatToDateTime正是为此目的而制作的,到目前为止,使用它似乎是您情况下的最佳选择。

Delphi示例:

uses SysUtils;

function IsValidDateTime(dt: Double): Boolean;
var
  dummy: TDateTime;
begin
  Result := TryFloatToDateTime(dt, dummy);
end;

C ++ Builder示例:

#include <SysUtils.hpp>

bool isValidDateTime(const double dt) 
{
    TDateTime dummy;
    return TryFloatToDateTime(dt, dummy);
}

此函数不仅方便(因为没有异常,而且已经存在),而且可读性很强,它遵循贯穿整个框架的良好约定:

  • 名称以Try开头表示可能失败
  • [Boolean直接结果表示有效操作
  • 间接结果获得实际值(如果操作成功)
© www.soinside.com 2019 - 2024. All rights reserved.