客户端时间如何与服务器时间同步(多层架构系统理应如此)

原创 2004年10月18日 21:28:00

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

    注意: GetTickCount API有一个限制,就是49天之后要清零,如果你不做处理的话会出错


*******调用--------------
 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;

获取时间程序(客户端和服务器)

一个获取时间的程序 vs2013 windows8.1 ********************************客户端*********************************...
  • hahahzzzzz
  • hahahzzzzz
  • 2016年05月23日 21:46
  • 1039

客户端同步服务器时间

1.ntpdate 命令: 1.1 当有时间服务器的时候,可以设置本地时间和时间服务同步 ntpdate 192.168.1.254 1.2 这种同步时间的方式,只会在执行命令时才会生效,所以需...
  • erbu1
  • erbu1
  • 2016年06月19日 23:39
  • 394

我是手游开发者(三)客户端与服务器时间同步问题

为防止用户修改当前时间,造成游戏逻辑混乱,客户端使用的时间为服务器时间。...
  • u010094934
  • u010094934
  • 2016年11月21日 23:57
  • 1055

js将本地时间与服务器时间同步

注意,代码中使用了angular中时间的格式化方法,如果你没有使用angular,可以自己找格式化时间的方法代替! 1.首先获取本地时间和服务器时间的时间间隔。(这里假设服务器传过来的时间是 201...
  • liangyiyiliang
  • liangyiyiliang
  • 2016年05月25日 16:32
  • 521

客户端时间如何与服务器时间同步(多层架构系统理应如此)

客户端时间如何与服务器时间同步(多层架构系统理应如此)多层系统开发,如何保持客户端与数据库或应用服务器时间同步是一个必须解决的问题 ,我发现许多系统取得是客户端的本地时间,造成多个客户端同时操作却时间...
  • NineFlowers
  • NineFlowers
  • 2004年10月18日 21:28
  • 2599

简单的时间/日期客户端&服务器程序

简单的时间/日期客户端&服务器程序 本文章代码根据《UNIX网络编程:卷1》修改而来,由于书中源码用于linux系统,题主在windows系统下进行模拟操作,作了部分修改。...
  • zuolj
  • zuolj
  • 2016年07月25日 16:26
  • 722

Android时间与服务器同步方法

Android时间与服务器同步方案 在部分软件应用场景里,我们对应用时间要求非常苛刻,如活动、商品秒杀倒计时操作,防止用户修改本机时间,导致应用错乱。 我们如果能让本地应用时间与服务器时间...
  • qinci
  • qinci
  • 2017年04月24日 22:58
  • 2169

Android与服务器通讯:如何保证两端时间一致性

在项目的开发过程中,项目要求无论终端是什么时区设置、地处何方,终端的时间是否正确,post到服务器的数据包里面的时间字段均要求跟服务器同步,也就是说,用户买来一部新手机、新平板,不做任何日期时间、时区...
  • rocklee
  • rocklee
  • 2014年08月28日 17:23
  • 2089

一个简单的时间获取客户端/服务器程序

TCP时间获取客户程序#include "unp.h"int main(int argc, char **argv) { int sockfd, n; c...
  • qq_33351410
  • qq_33351410
  • 2016年09月18日 11:01
  • 1862

websphere停止服务:此日期在当前日期/时间之后有效。如果客户机的时钟设置得比服务器的时钟早,就会出现这种情况。请验证此客户机与服务器的时钟是否同步,然后重试该请求。

[15-12-1 0:41:29:483 CST] 00000001 WSX509TrustMa E   CWPKI0311E: 主体集 DN 为 CN=localhost, OU=dz-0191No...
  • gongli109
  • gongli109
  • 2016年01月19日 16:55
  • 1664
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:客户端时间如何与服务器时间同步(多层架构系统理应如此)
举报原因:
原因补充:

(最多只允许输入30个字)