【问题标题】:How to check TDateTime contents are valid如何检查 TDateTime 内容是否有效
【发布时间】:2012-07-31 19:44:53
【问题描述】:

有没有办法在不捕获转换异常的情况下检查 Delphi TDateTime 变量是否具有有效内容?

我编写了一个应用程序,它必须解析数百个以原始 Delphi 记录形式编写的包含TDateTime 字段的大文件。有时我会得到一条记录,其中内容具有TDateTime 值,例如2.0927117954e+262,它在传递给转换例程时会给出Floating point invalid Operation 异常。我知道我可以简单地捕获异常,但这在调试时会很麻烦,因为调试器会一直停止,我想保持启用它以防出现其他错误。

【问题讨论】:

  • 定义“有效内容”。 TDateTime 基本上只是一个具有特殊语义的Double。每个值在技术上都是有效的。如果您的转换例程出现错误,请显示实际的转换例程、输入值和错误。

标签: delphi validation datetime vcl tdatetime


【解决方案1】:

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

var
  d: TDateTime;
..

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      阅读您的问题描述后,我得出结论,如果某些记录具有损坏/无效的时间值,那么您的应用程序继续读取文件绝对有效,因此您希望跳过它(否则可能标记或收集问题)。

      VCL 函数System.SysUtils.TryFloatToDateTime 正是为此目的而设计的,到目前为止,使用它对我来说似乎是最好的选择。

      德尔福示例:

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

      C++ 构建器示例:

      #include <SysUtils.hpp>
      
      bool isValidDateTime(const double dt) 
      {
          TDateTime dummy;
          return TryFloatToDateTime(dt, dummy);
      }
      

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

      • 名称以Try 开头,表示它可能会失败
      • Boolean 直接结果表明操作有效
      • 间接结果获取实际值(如果操作成功)

      【讨论】:

      • 不知道,我不认为它是 到目前为止 最好的选择,但是 + 1。Ctrl+单击它,你会看到它与我的回答相同,将值与 MinDateTime 和 MaxDateTime 进行比较。但是据此,我的答案可能在 MaxDateTime 上相差 1。
      • @SertacAkyuz 到目前为止,您的回答是我最喜欢的,但该功能(我已经检查过它的功能基本相同)更紧凑,并且还有一个富有表现力的名称。我在探索 MinTimeValueMaxTimeValue 的命名空间时偶然发现了它...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-04
      • 1970-01-01
      • 1970-01-01
      • 2012-10-28
      • 2010-12-20
      • 2011-08-01
      • 1970-01-01
      相关资源
      最近更新 更多