【发布时间】:2017-01-26 11:42:24
【问题描述】:
(背景)我有一个程序,它使用参数化查询在数据库上搜索一天中的时间。所需的功能意味着我会在一天结束的时候进行一些搜索,所以我自然会有如下代码
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 产品的特殊问题可能意味着这是故意的。
【问题讨论】:
-
您可以通过使用 .Asxxxx 函数来设置参数值而不是使用 .Value 来避免变体
-
您实际上应该避免使用 TimeOf 函数,而只使用 FormatDateTime 函数