收到一个需要定时同步远程服务器的需求,用C# 实现

网上搜索到解决方案,代码如下:

获取远程时间

参数配置:"NTPServer"  远程时间服务器地址

获取远程服务器时间代码:

public class NTPTimeHelper
{
/// <summary>
/// 获取NTC时间
/// </summary>
/// <returns></returns>
public static DateTime GetNetworkTime()
{ //default Windows time server
string ntpServer = ConfigHelper.GetConfigToStr("NTPServer", ""); // NTP message size - 16 bytes of the digest (RFC 2030)
var ntpData = new byte[48]; //Setting the Leap Indicator, Version Number and Mode values
ntpData[0] = 0x1B; //LI = 0 (no warning), VN = 3 (IPv4 only), Mode = 3 (Client Mode) var addresses = Dns.GetHostEntry(ntpServer).AddressList; //The UDP port number assigned to NTP is 123
var ipEndPoint = new IPEndPoint(addresses[0], 123);
//NTP uses UDP
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); socket.Connect(ipEndPoint); //Stops code hang if NTP is blocked
socket.ReceiveTimeout = 3000; socket.Send(ntpData);
socket.Receive(ntpData);
socket.Close(); //Offset to get to the "Transmit Timestamp" field (time at which the reply
//departed the server for the client, in 64-bit timestamp format."
const byte serverReplyTime = 40; //Get the seconds part
ulong intPart = BitConverter.ToUInt32(ntpData, serverReplyTime); //Get the seconds fraction
ulong fractPart = BitConverter.ToUInt32(ntpData, serverReplyTime + 4); //Convert From big-endian to little-endian
intPart = SwapEndianness(intPart);
fractPart = SwapEndianness(fractPart); var milliseconds = (intPart * 1000) + ((fractPart * 1000) / 0x100000000L); //**UTC** time
var networkDateTime = (new DateTime(1900, 1, 1, 0, 0, 0, DateTimeKind.Utc)).AddMilliseconds((long)milliseconds); return networkDateTime.ToLocalTime();
} // stackoverflow.com/a/3294698/162671
static uint SwapEndianness(ulong x)
{
return (uint)(((x & 0x000000ff) << 24) +
((x & 0x0000ff00) << 8) +
((x & 0x00ff0000) >> 8) +
((x & 0xff000000) >> 24));
}
}

  获取服务器后修改本地服务器时间:

/// <summary>
///
/// </summary>
internal struct SYSTEMTIME
{
public ushort wYear;
public ushort wMonth;
public ushort wDayOfWeek;
public ushort wDay;
public ushort wHour;
public ushort wMinute;
public ushort wSecond;
public ushort wMilliseconds; /// <summary>
/// 从System.DateTime转换。
/// </summary>
/// <param name="time">System.DateTime类型的时间。</param>
public void FromDateTime(DateTime time)
{
wYear = (ushort)time.Year;
wMonth = (ushort)time.Month;
wDayOfWeek = (ushort)time.DayOfWeek;
wDay = (ushort)time.Day;
wHour = (ushort)time.Hour;
wMinute = (ushort)time.Minute;
wSecond = (ushort)time.Second;
wMilliseconds = (ushort)time.Millisecond;
}
/// <summary>
/// 转换为System.DateTime类型。
/// </summary>
/// <returns></returns>
public DateTime ToDateTime()
{
return new DateTime(wYear, wMonth, wDay, wHour, wMinute, wSecond, wMilliseconds);
}
/// <summary>
/// 静态方法。转换为System.DateTime类型。
/// </summary>
/// <param name="time">SYSTEMTIME类型的时间。</param>
/// <returns></returns>
public static DateTime ToDateTime(SYSTEMTIME time)
{
return time.ToDateTime();
}
}
internal class Win32API
{
[DllImport("Kernel32.dll")]
public static extern bool SetLocalTime(ref SYSTEMTIME Time);
[DllImport("Kernel32.dll")]
public static extern void GetLocalTime(ref SYSTEMTIME Time);
} public class SystemHelper
{
public static void SetLocalMachineTime(DateTime dt)
{
//转换System.DateTime到SYSTEMTIME
SYSTEMTIME st = new SYSTEMTIME();
st.FromDateTime(dt);
//调用Win32 API设置系统时间
Win32API.SetLocalTime(ref st);
}
}

  这样就可以了。

本文引用:http://xqblog.top/Article.aspx?id=ART2018040200001

最新文章

  1. 基于android studio编译工具下的android开发之IBeacon 例子
  2. openstack虚拟机启动过程
  3. java线程之——synchronized的注意细节
  4. 027. asp.net中数据绑定控件之 GridView控件
  5. bing 输入法,切换简体、繁体快捷键与myeclipse 格式化代码冲突。。
  6. IT技术 | 让程序员抓狂的排序算法教学视频
  7. 201521123091 《Java程序设计》第10周学习总结
  8. 55、js对象
  9. Mybatis中DAO层接口没有写实现类,Mapper中的方法和DAO接口方法是怎么绑定到一起的,其内部是怎么实现的
  10. Innodb buffer 相关参数
  11. python文件基础IO,OS
  12. 开发webapp手机返回键 退出问题 摘录
  13. kudu 存储引擎简析
  14. tesseract_ocr+pytesseract图像识别
  15. HDU 4818 RP problem (高斯消元, 2013年长春区域赛F题)
  16. hdu 5246 乱搞
  17. HTTP API 设计指南(基础部分)
  18. TCP三次握手和四次挥手以及11种状态
  19. 用QQ帐号和新浪微博帐号登录网站
  20. ubuntu 18.04在更新软件库时出现E: Release file for http://security.ubuntu.com/ubuntu/dists/bionic-security/InRelease is not valid yet...

热门文章

  1. Java中的异常处理从概念到实例
  2. BZOJ3398: [Usaco2009 Feb]Bullcow 牡牛和牝牛(dp)
  3. maven引入dubbo包后启动报错
  4. goaccess 安装
  5. 一个简单的linux下设置定时执行shell脚本的示例
  6. 获取PHP页面的当前文件名(包括后缀名)
  7. 【linux】CPU,内存对网站的影响
  8. C语言用一维数组打印杨辉三角(原:无意中想到)
  9. CodeForces 781E Andryusha and Nervous Barriers 线段树 扫描线
  10. 连续小波变换CWT(2)