今天做项目的时候遇到了一个问题,即客户端程序通过一个接口从后台获取到一个服务器时间后,需要在客户端的右下角实时展示服务器时间,并且要提供函数供客户端内的功能随时获取当前的服务器时间。
在这种情况下,每次都调用前后台接口获取服务器时间显然是不显示的,为此我想出了一个方法。
先定义几个概念:
1、历史本地时间(LocalDateTimeHis),即向后台请求服务器时间时获取到的本地时间
2、历史服务器时间(SysDateTimeHis),即向后台请求服务器时间时获取到的服务器时间
3、时间偏移量(Offset),时间偏移量=历史服务器时间-历史本地时间
4、手工校正值(Correct),可根据自身程序运行情况设置,我设置为1秒,以抵消网络延迟导致的时间差
5、当前服务器时间(SysDateTime),DateTime结构类型变量,系统时间=本地当前时间+偏移量+手工校正值
上面五项中,只要知道了(1)和(2),后面的(3)、(4)、(5)都可以计算出来,(1)可以通过DateTime.Now获取,(2)通过调用前后台接口获取。
下面是管理类的C#代码,需要说明:本工具类并未实现客户端获取服务器时间部分的代码,本工具类的功能是在客户端一次性获取服务器时间后,对外提供当前的服务器时间。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace SystemDateTimeTest
{
/// <summary>
/// 系统时间同步工具类
/// </summary>
public static class SystemDateTimeHelper
{
/// <summary>
/// 工具类是否初始化
/// </summary>
private static bool _isInit = false;
/// <summary>
/// 工具类是否初始化 - 只有初始化后才能获取系统时间
/// </summary>
public static bool IsInit
{
get
{
return _isInit;
}
private set
{
_isInit = value;
}
}
/// <summary>
/// 更新时系统时间
/// </summary>
private static DateTime _sysDateTimeHis;
/// <summary>
/// 更新时系统时间
/// </summary>
public static DateTime SysDateTimeHis
{
&