【问题标题】:Bad conversion from EndOfTheMonth(date) to Variant value从 EndOfTheMonth(date) 到 Variant 值的错误转换
【发布时间】:2012-04-05 11:32:14
【问题描述】:

我有一个变体类型的TDateTime 值(我从EndOfTheMonth(date) 得到的结果)。结果被错误地四舍五入。我们来看一个例子:

  data := EndOfTheMonth(date);
  V := data;
  ShowMessage(DateTimeToStr(data) + ' vs ' + VarToStr(V));
 // output is
 // data = 2012-01-31 23:59:59
 // v    = 2012-02-01            // why next day?

这是设计的行为吗? 如何解决这个问题?

【问题讨论】:

    标签: delphi datetime rounding delphi-xe2 variant


    【解决方案1】:
    ShowMessage(DateTimeToStr(data) + ' vs ' + DateTimeToStr(VarToDateTime(V)));
    

    更新:我猜是这个月的最后一个毫秒非常接近第二天的0:00:00,也就是TDateTime的值(基本上就是double) 非常接近整数(例如,41029.9999999884 非常接近 41029),因此 VarToStr 函数假定小数是数字模糊。

    【讨论】:

    • DateTimeToStr(V) 也显示了正确的结果。显然,问题出在VarToStr() 函数上。
    • @AndriyM:是的,但过于明确永远不会(?)错误! :)
    • @JustMe:我没有仔细研究过该页面,但我很确定针对这个特定问题的 最佳 解决方法是我在上面给出的解决方法(或Andrily M 建议的稍微简短的版本)。
    • @AndreasRejbrand 谢谢 - 他们使用vartostr() 函数来检查 TDateTime 值是否正确转换为变量,并假设这不是他们软件中的错误?
    • 我猜不是。我只是添加更多证据来指出该问题与舍入无关(将 TDateTime 分配给 Variant 时)。在深入挖掘之后,我发现VarToStr() 并没有犯罪:只是调用VarToStrDef(),而后者只是执行这个任务:Result := V(即(string) := (Variant))。所以,我猜,到字符串的转换是在较低级别完成的。 (注意:我在研究中使用了 Delphi 6。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多