设为首页收藏本站language 语言切换
查看: 1115|回复: 12
收起左侧

多层架构系统理应如此

[复制链接]
发表于 2009-12-21 12:12:01 | 显示全部楼层 |阅读模式
          客户端时间如何与服务器时间同步(多层架构系统理应如此)
多层系统开发,如何保持客户端与数据库或应用服务器时间同步是一个必须解决的问题 ,我发现许多系统取得是客户端的本地时间,造成多个客户端同时操作却时间不一样。而许多人采用频繁从数据库中取值的形式,增加服务器负载压力。当然有人说,数据保存的时候应该取数据库中时间 ,不错,但是涉及到本地数据之间的校验这类的操作,你该不会频繁地去数据库中得时间吧。鉴于此,本文利用windows系统的一个Api函数进行时间同步 。具体参下面类:(Delphi语法实现,当然)


*******调用--------------
var
       myDateTime : TmyDateTime;  //全局变量,供整个工程使用

//----------------------------------------------------
  Procedure InitialDateTimeWhenSystemStart;//------系统启动的时候进行初始化
  begin
       myDateTime := TmyDateTime.Create;
      //getServerDateTimeStr是从服务器取得的14位时间字符串
        myDateTime.AppserverDataTimeStr := getServerDateTimeStr ;
        myDateTime.InitialDateTimeSpan;//初始化
   end;
//-----------------------------------------------------------

TmyDateTime = class
  private
   // FDateTimeInterval: Double;
    FDateTimeInterval: TDateTime;
    FAppserverDataTimeStr: string;

    FServerDateTime: TDateTime; //第一次登录服务器的时间
    FSysTickCount: Double;

    procedure SetDateTime;
    function GetDateTime_: TDateTime;
  public
    constructor create;
    procedure InitialDateTimeSpan;
    //---初始化本地时间与系统时间的间隔

    property CurrentDataTime: TDateTime read GetDateTime_;

      property AppserverDataTimeStr: string read FAppserverDataTimeStr write FAppserverDataTimeStr;
  end;

implement

{ TmyDateTime }





function TmyDateTime.GetDateTime_: TDateTime;
var
  FSysTickCount_: Double;
begin
  FSysTickCount_ := GetTickCount;
  Result := FServerDateTime + (FSysTickCount_ - FSysTickCount) / (24 * 60 * 60 * 1000);
{ if FDateTimeInterval < 0 then
    Result := (Now - FDateTimeInterval)
  else
    Result := (Now + FDateTimeInterval); }

end;



procedure TmyDateTime.InitialDateTimeSpan;
//---初始化本地时间与系统时间的间隔
var
  wYear, wMonth, wDay, wHour, wMinute, wSecond, wMili: word;
begin
  try
    wYear := StrToInt(copy(FAppserverDataTimeStr, 1, 4));
    wMonth := StrToInt(Copy(FAppserverDataTimeStr, 5, 2));
    wDay := StrToInt(copy(FAppserverDataTimeStr, 7, 2));
    wHour := StrToInt(copy(FAppserverDataTimeStr, 9, 2));
    wMinute := StrToInt(copy(FAppserverDataTimeStr, 11, 2));
    wSecond := StrToInt(copy(FAppserverDataTimeStr, 13, 2));
    wMili := 100;
    FServerDateTime := EncodeDateTime(wYear, wMonth, wDAy, wHour, wMinute, wSecond, wMili);
    FSysTickCount := GetTickCount;
   // FDateTimeInterval := MilliSecondSpan(Now, FServerDateTime);
    //FDateTimeInterval := Now - FServerDateTime;
  except
   // FDateTimeInterval := 0;
  end;
end;

procedure TmyDateTime.SetDateTime;
var
  wyear, wmonth, wday, whour, waminute, wsecond, wmilisencond: word;
  smonth, sday, shour, saminute, ssecond: string;

  ExactDateTime: TDateTime;
  FSysTickCount_: Double;
begin
  //ExactDateTime := FloatToDateTime(Now + FDateTimeInterval);
  {if FDateTimeInterval < 0 then
    ExactDateTime := (Now - FDateTimeInterval)
  else
    ExactDateTime := (Now - FDateTimeInterval); }
//  ExactDateTime := (Now - FDateTimeInterval);
  FSysTickCount_ := GetTickCount;
  ExactDateTime := FServerDateTime + (FSysTickCount_ - FSysTickCount) / (24 * 60 * 60 * 1000);

  DecodeDateTime(ExactDateTime, wyear, wmonth, wday, whour, waminute, wsecond, wmilisencond);
  sMonth := IntToStr(wMonth);
  if Length(sMonth) < 2 then sMonth := '0' + sMonth;
  sday := IntToStr(wday);
  if Length(sday) < 2 then sday := '0' + sday;
  shour := IntToStr(whour);
  if Length(shour) < 2 then shour := '0' + shour;
  saminute := IntToStr(waminute);
  if Length(saminute) < 2 then saminute := '0' + saminute;
  ssecond := IntToStr(wsecond);
  if Length(ssecond) < 2 then ssecond := '0' + ssecond;
  FAppserverDataTimeStr := IntToStr(wyear) + smonth + sday + shour + saminute + ssecond; //smilisencond;
end;
发表于 2009-12-23 10:33:59 | 显示全部楼层

我来看看 这个能用吧!

我来看看 这个能用吧!
沙发 2009-12-23 10:33:59 回复 收起回复
回复 支持 反对

使用道具 举报

发表于 2009-12-23 11:12:48 | 显示全部楼层

谢谢分享了!

谢谢分享了!
板凳 2009-12-23 11:12:48 回复 收起回复
回复 支持 反对

使用道具 举报

发表于 2009-12-23 12:47:18 | 显示全部楼层

谢谢分享

谢谢分享
地板 2009-12-23 12:47:18 回复 收起回复
回复 支持 反对

使用道具 举报

发表于 2009-12-24 10:16:55 | 显示全部楼层

晕。。。。怎么没早看到呢。。。。。。。。。

晕。。。。怎么没早看到呢。。。。。。。。。
5# 2009-12-24 10:16:55 回复 收起回复
回复 支持 反对

使用道具 举报

发表于 2009-12-24 10:51:37 | 显示全部楼层

应该加分

应该加分
6# 2009-12-24 10:51:37 回复 收起回复
回复 支持 反对

使用道具 举报

发表于 2009-12-25 12:04:10 | 显示全部楼层

支持~~

支持~~
7# 2009-12-25 12:04:10 回复 收起回复
回复 支持 反对

使用道具 举报

发表于 2009-12-25 12:40:49 | 显示全部楼层

楼主工作顺利,继往开来!

楼主工作顺利,继往开来!
8# 2009-12-25 12:40:49 回复 收起回复
回复 支持 反对

使用道具 举报

发表于 2009-12-25 14:44:00 | 显示全部楼层

回答了那么多,没有加分了,郁闷。。

回答了那么多,没有加分了,郁闷。。
9# 2009-12-25 14:44:00 回复 收起回复
回复 支持 反对

使用道具 举报

发表于 2009-12-27 11:45:16 | 显示全部楼层

我等你哟!

我等你哟!
10# 2009-12-27 11:45:16 回复 收起回复
回复 支持 反对

使用道具 举报

发表于 2009-12-27 12:20:56 | 显示全部楼层

谢 谢

谢 谢
11# 2009-12-27 12:20:56 回复 收起回复
回复 支持 反对

使用道具 举报

发表于 2009-12-29 12:26:47 | 显示全部楼层

看看怎么样

看看怎么样
12# 2009-12-29 12:26:47 回复 收起回复
回复 支持 反对

使用道具 举报

发表于 2009-12-30 12:31:38 | 显示全部楼层

谁都不容易啊 ~~

谁都不容易啊 ~~
13# 2009-12-30 12:31:38 回复 收起回复
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 论坛注册

本版积分规则

QQ|Archiver|手机版|小黑屋|sitemap|鸿鹄论坛 ( 京ICP备14027439号 )  

GMT+8, 2025-2-26 14:27 , Processed in 0.083668 second(s), 24 queries , Redis On.  

  Powered by Discuz!

  © 2001-2025 HH010.COM

快速回复 返回顶部 返回列表