- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
(背景)我有一个程序,它使用参数化查询对数据库进行按时搜索。所需的功能意味着我会在一天结束时进行一些搜索,因此我自然会有如下代码
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/
我是一名优秀的程序员,十分优秀!