首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何检查TDateTime内容是否有效

如何检查TDateTime内容是否有效
EN

Stack Overflow用户
提问于 2012-08-01 03:44:53
回答 3查看 2.2K关注 0票数 2

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

我写了一个应用程序,它必须解析数以百计的大型文件,这些文件被写成包含TDateTime字段的原始Delphi记录。偶尔我会得到一个记录,其中的内容有一个TDateTime值,比如2.0927117954e+262,它在传递给转换例程时会给出一个Floating point invalid Operation异常。我知道我可以简单地捕获异常,但这在调试时非常麻烦,因为调试器一直在停止,我希望在发生其他错误的情况下保持启用它。

EN

回答 3

Stack Overflow用户

发布于 2012-08-01 05:07:14

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

代码语言:javascript
复制
var
  d: TDateTime;
..

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

Stack Overflow用户

发布于 2012-08-01 17:23:09

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

票数 5
EN

Stack Overflow用户

发布于 2014-09-05 17:45:05

阅读你的问题描述,我得出的结论是,如果某些记录有损坏/无效的时间值,所以你想跳过它(可以标记或收集问题),那么你的应用程序继续读取文件是绝对有效的。

VCL函数System.SysUtils.TryFloatToDateTime就是为此目的而创建的,对我来说,使用它似乎是最好的选择。

Delphi示例:

代码语言:javascript
复制
uses SysUtils;

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

C++生成器示例:

代码语言:javascript
复制
#include <SysUtils.hpp>

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

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

  • 名称以Try开头,表示它可以直接执行结果,以指示有效的结果获取实际值(如果操作成功)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11747813

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档