C# 同步更新系统时间
前言
在定位用户问题时,发现有些电脑,会出现系统时间不是最新的问题。
可能原因:
- 取消了勾选服务器时间同步
- 当前安装的系统,是一个未知来源系统,导致系统时间更新失败

而系统时间不正确,会导致IE选项-证书,校验不通过~
更新系统时间
1. 连接时间服务器
时间服务器列表(推荐): string[] timeHosts = { "time.windows.com", "time.nist.gov" };
/// <summary>
/// 连接时间服务器
/// </summary>
/// <param name="socket">服务器接口</param>
/// <param name="startTime">开始时间</param>
/// <param name="errorMsg">错误信息</param>
/// <returns></returns>
private static bool TryConnectToTimeServer(out Socket socket, out DateTime startTime, out string errorMsg)
{
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建Socket
socket.ReceiveTimeout = * ;//设置超时时间
errorMsg = string.Empty;
startTime = DateTime.Now; // 遍历时间服务器列表
foreach (string strHost in timeHosts)
{
try
{
// 记录开始的时间
startTime = DateTime.Now; var iphostinfo = Dns.GetHostEntry(strHost);
var ip = iphostinfo.AddressList[];
//建立IPAddress对象与端口,创建IPEndPoint节点:
int port = ;
var ipe = new IPEndPoint(ip, port);
//连接到服务器
socket.Connect(ipe);
// 如果连接到服务器就跳出
if (socket.Connected) break;
}
catch (Exception ex)
{
errorMsg = $"时间服务器连接失败!\r\n错误信息:{ex.Message}系统提示";
}
}
return socket.Connected;
}
2. 从服务器接收数据
/// <summary>
/// 从服务器接收数据
/// </summary>
/// <param name="socket"></param>
/// <returns></returns>
private static StringBuilder ReceiveMessageFromServer(Socket socket)
{
//SOCKET同步接受数据
byte[] receiveBytes = new byte[];
int nBytes, nTotalBytes = ;
StringBuilder sb = new StringBuilder();
System.Text.Encoding encoding = Encoding.UTF8; while ((nBytes = socket.Receive(receiveBytes, , , SocketFlags.None)) > )
{
nTotalBytes += nBytes;
sb.Append(encoding.GetString(receiveBytes, , nBytes));
} return sb;
}
3. 更新本地时间
/// <summary>
/// 更新系统时间
/// </summary>
/// <returns>更新结果</returns>
public static string UpdateSystemTime()
{
try
{
var connected = TryConnectToTimeServer(out Socket socket, out var startTime, out string errorMsg);
if (connected)
{
var receivedMsg = ReceiveMessageFromServer(socket);
socket.Close();
//切割字符串
string[] receiveMsgList = receivedMsg.ToString().Split(' ');
if (receiveMsgList.Length >= )
{
var dateTimeValue = receiveMsgList[] + " " + receiveMsgList[];
SetLocalTime(startTime, dateTimeValue);
}
}
else
{
return errorMsg;
}
}
catch (Exception e)
{
return $"函数{nameof(UpdateSystemTime)}执行异常,{e.Message}";
}
return "时间已同步";
}
/// <summary>
/// 设置系统时间
/// </summary>
/// <param name="startTime">请求服务器时的开始时间</param>
/// <param name="dateTimeValue">服务器返回的时间</param>
private static void SetLocalTime(DateTime startTime, string dateTimeValue)
{
// 得到开始到现在所消耗的时间
TimeSpan k = DateTime.Now - startTime;
// 减去中途消耗的时间
DateTime updatedUtcTime = Convert.ToDateTime(dateTimeValue).Subtract(-k); //处置北京时间 +8时
var updatedTime = updatedUtcTime.AddHours(); //转换System.DateTime到SystemTime
SystemTime systemTime = new SystemTime();
systemTime.FromDateTime(updatedTime); //调用Win32 API设置系统时间
Win32API.SetLocalTime(ref systemTime);
}
系统时间辅助类 & Win32API :
/// <summary>
/// 系统时间帮助类
/// </summary>
public 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();
}
} /// <summary>
/// 系统更新时间DLL
/// </summary>
public class Win32API
{
[DllImport("Kernel32.dll")]
public static extern bool SetLocalTime(ref SystemTime Time);
[DllImport("Kernel32.dll")]
public static extern void GetLocalTime(ref SystemTime Time);
}
Github地址:IE环境修复工具
C# 同步更新系统时间的更多相关文章
- Linux命令-更新系统时间和硬件时间
查看系统时间和时区: date 查看系统时间date -R 查看时区 修改时区: tzselect 修改时区 或 cp /usr/share/zoneinfo/Asia/Shanghai /etc/l ...
- ntpdate更新系统时间时报错Can't find host ntp1.aliyun.com: Servname not supported for ai_socktype (-8)
ntpdate更新系统时间时报错Can't find host ntp1.aliyun.com: Servname not supported for ai_socktype (-8) 所报错误: [ ...
- CentOS 7更新系统时间
Linux系统在安装的时候,总是会出现时区,时间的错误. 将Linux系统时间和本地区网络时间同步,ntpdate可以从网络同步时间, 需要安装sudo yum install ntp ntpdate ...
- 更新系统时间 & 查看/修改LINUX时区和时间
一.时区0. date '+%Y%M%D' 按照格式显示当前日期,结果如下: date "+%Y-%m-%d %H:%M:%S" 1. 查看当前时区 :[root@master ~ ...
- 同步linux系统时间
Linux的时间分为System Clock(系统时间)和Real Time Clock (硬件时间,简称RTC). 系统时间:指当前Linux Kernel中的时间. 硬件时间:主板上有电池供电的时 ...
- linux更新系统时间
查看时间 date 更新时间 yum install ntpdate ntpdate time.windows.com
- Linux命令更新系统时间,更新所有文件的时间(转)
https://blog.csdn.net/ccj2020/article/details/76026606
- bat 同步windows系统时间
需要使用管理员权限运行 net start w32timew32tm /config /updatew32tm /resync /rediscovernet stop w32timepause
- Cef 因系统时间不正常,导致页面访问空白问题
当我们的系统时间不正常,比如设置一个日期-1999年9月9日,会引发证书问题. 系统时间不正常-IE有概率能访问 触发NavigateError事件,异常代码INET_E_INVALID_CERTIF ...
随机推荐
- Eclipse之注释部分代码
有时为了调试,部分代码需要注释掉,如果一行一行的加注释符特别麻烦. 一.快捷键:ctrl+/ 选择需要注释的部分,点Ctrl+/,这段代码前,自动加注释语. 取消注释也是按Ctrl+/ 步骤: 选择需 ...
- ROS:ubuntuKylin17.04-Ros使用OrbSLAM2
忙于图像处理和DCNN,很长时间不使用ROS,重新安装系统后,再次使用ORB-SLAM2(ROS)进行三维重建和实时追踪的演示. 参考以前的文章:ROS:ubuntu-Ros使用OrbSLAM ORB ...
- (1)dotnet开源电商系统-brnshop&brnMall 和老外开发的nopCommerce(dotnet两套电商来PK--第一篇)
一直想做电商软件,但是实在不想学PHP了,所以前后关注了这两个开源电商系统.一个是国人出品的,一个据说是俄罗斯人写得(不知道对不对).目前两个开源软件都在学习了解中,以下的博文可能会涉及到这两套系统, ...
- php常用字符串和例子
//输出一个或多个字符串 //注:echo 不是一个函数(它是一个语言结构), 因此你不一定要使用小括号来指明参数,单引号,双引号都可以 $a = "admin1"; $b = & ...
- webstorm界面主题
http://www.webstormthemes.com/
- SQL中的条件判断语句(case when zhen if,ifnull)用法
简介: case具有两种格式.简单case函数和case搜索函数.这两种方式,可以实现相同的功能.简单case函数的写法相对比较简洁,但是和case搜索函数相比,功能方面会有些限制,比如写判定式.还有 ...
- JDK环境变量设置(linux)
1.下载jdk1.8版本软件包 2.解压 tar -zxvf jdk1.8.tar.gz mv jdk1.8 /usr/local/ 3.添加环境变量 vim /etc/profile 在文件底部加入 ...
- 编码的由来,ASCII编码,和字节的形成
一.编码的由来 计算机只能计算和识别二进制,必须让计算机识别文字,才能和计算机进行交互,彼此也才能通过计算机通信. 由此,有了ASCII编码的诞生,它起始于50年代后期,在1967年定案,是最初美国国 ...
- matplotlib的annotate用法小结
这个是matplotlib自定义的annotate方法的文本: 一. def annotate(self, s, xy, *args, **kwargs): a = mtext.Annotation( ...
- JS-正则表达式实战篇(Angel著)
JS-正则表达式实战篇(Angel著) 大家会看到我最新的系列博客都是spring boot怎么突然来了一个js的呢,而且这个貌似对大家而言好像很简单的嘛,所以在写之前我说说我写这一篇文章的初衷.公司 ...