【发布时间】:2012-12-06 17:35:54
【问题描述】:
我必须将我的本地日期和时间与从数据库返回的相同日期和时间同步。
sql:
select first 1 CURRENT_TIMESTAMP from RDB$DATABASE
此 SQL 命令返回数据库服务器的当前日期和时间。
现在,我需要缓存它并根据本地差异提供正确的时间。 问题是可以再次更改本地日期和时间。
如何在不再次执行 SQL 的情况下保证正确的日期时间?
我找到了解决办法:
var
SQLTimestamp: TDateTime=0;
LocalTimestamp: TDateTime=0;
function SysUpTime : TDateTime;
var
Count, Freq : int64;
begin
QueryPerformanceCounter(count);
QueryPerformanceFrequency(Freq);
if (count<> 0) and (Freq <> 0) then
begin
Result := Count / Freq;
Result := result / SecsPerDay;
end
else
Result := 0;
end;
function RealTime: TDateTime;
var
queryTime, dbTime: tdatetime;
begin
if SQLTimestamp = 0 then
begin
queryTime := SysUpTime;
dbTime := // SQL QUERY EXECUTION
queryTime := SysUpTime - queryTime;
LocalTimestamp := SysUpTime;
SQLTimestamp := dbTime + queryTime;
end;
Result := SQLTimestamp + (SysUpTime - LocalTimestamp);
end;
现在我的问题是:QueryPerformanceCounter 和 QueryPerformanceFrequency 与 GetTickCount 有相同的限制?
The elapsed time is stored as a DWORD value. Therefore, the time will wrap around to zero if the system is run continuously for 49.7 days.
【问题讨论】:
-
首先,你不能。时间在流逝,所以客户需要直接阅读。其次,在 Vista 及更高版本(或以非超级用户身份运行的 XP)上,更改系统日期或时间需要管理员权限。
-
要添加到其他 cmets... 你永远无法知道时间是什么,只能知道它是什么。有 NTP 之类的工具可以解决这个问题,这个问题早就解决了。
-
我不想改变操作系统的日期时间,我只想有一个速记来查询数据库的日期时间,假设那个时间(在数据库中)永远不会改变。跨度>
-
您提出了两个完全不同的问题。您想知道如何避免询问服务器现在几点了吗?或者你想知道 QueryPerformanceCounter 的局限性吗?请编辑您的问题以仅提出 一个 问题。请记住,您可以发布不限数量的单独问题,并且当您的单独问题彼此不相关时,我们鼓励这样做,就像这里的情况一样。跨度>
-
您希望函数的精度是多少?
标签: sql windows delphi firebird