gpt4 book ai didi

delphi - 当天结束时的变体误传

转载 作者:行者123 更新时间:2023-12-03 15:49:42 33 4
gpt4 key购买 nike

(背景)我有一个程序,它使用参数化查询对数据库进行按时搜索。所需的功能意味着我会在一天结束时进行一些搜索,因此我自然会有如下代码

Query.Parameters[3].Value := TimeOf(EnfOfTheDay(ToTime));

此操作失败并出现格式错误,因为时间显示为“31/12/1899”。以下控制台程序演示了这一点,该程序在系统控制台(或您的区域设置中的等效内容)上输出“31/12/1899”。

program Project1;
{$APPTYPE CONSOLE}
{$R *.res}

uses
System.SysUtils, System.DateUtils;
var
V: variant;
Time: TDateTime;
begin
Time := TimeOf(EndOfTheDay(EncodeDate(2017,1,26)));
V := Time;
Write(Output, V);
ReadLn;
end.

这很容易解决,但我的问题是这是否是一个应该向 Embarcadero 报告的错误。我可以看到,当 TDateTime 类型中的仅时间值存储到变体中,然后将其强制为文本时,就会出现该问题。当天早些时候的时间可以很好地产生像“23:59”这样的字符串。

如果我将 Time 变量更改为 TTime,则生成的字符串是数字分数(即 Variant 尚未设置为日期时间值),但我不明白为什么特定分数等于 23:59 :59(EndOfTheDay 生成的内容)被解释为 1899 年日期。我对任何产生 1899 年延期日期的事情都抱有天生的怀疑,因为 Microsoft 产品的特殊问题可能意味着这是故意的。

最佳答案

变体表示将设置为 varDate,其内部是一个 TDateTime 变量。因此该信息仍然保留在变体中。

WriteLn(Output, FormatDateTime('hh:nn:ss',V)); 

输出

23:59:59

错误出现在变体 VarToStr 上最终调用的例程:

function DateToWStrViaOS(const AValue: TDateTime): WideString;
begin
VarResultCheck(VarBStrFromDate(AValue, VAR_LOCALE_USER_DEFAULT, 0, Result),
varDate, varOleStr);
end;

VarBStrFromDate 是对操作系统的调用,它以某种方式将值舍入为 1,因此日期为“31/12/1899”。

<小时/>

结论,如果您仍想在数据库中使用变体,请不要使用变体库提供的 TDateTime 内置变体到文本转换。

<小时/>

更新:EndOfTheDay 将返回午夜前 1 毫秒的时间。转换为文本时的变体分辨率似乎是基于秒的(Windows 设计)。将时间设置为 1 并用 Time := IncMilliSecond(Time,-501) 相减将返回正确的值。 (或者如果您愿意的话,Time := IncSecond(Time,-1)。)

关于delphi - 当天结束时的变体误传,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41872709/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com