有个业务需求是需要同步两台电脑的系统时间,准确性没有要求很高,只需要秒级,所以我就是用UDP进行同步系统时间。
主要原理就是通过调用kernel32动态库中的SetSystemTime方法可以设置系统时间。
不过这个方法需要你的程序具有管理员权限。
关于管理员权限,你只需要在你的可执行程序的【兼容性】选项卡中 勾选 【以管理员身份运行此程序】。
[DllImport("kernel32.dll",CharSet =CharSet.Ansi)]
public extern static bool SetSystemTime(ref SYSTEMTIME time);
[StructLayout(LayoutKind.Sequential)]
public struct SYSTEMTIME
{
public short Year;
public short Month;
public short DayOfWeek;
public short Day;
public short Hour;
public short Minute;
public short Second;
public short Miliseconds;
}
/// <summary>
/// 将时间戳转换为DateTime对象(秒级)
/// </summary>
public static DateTime ConvertTimestampToDateTime(long timestamp)
{
return DateTimeOffset.FromUnixTimeSeconds(timestamp).ToLocalTime().DateTime;
}
public DateTime SetTime(long stamp)
{
DateTime dateTime= ConvertTimestampToDateTime((long)(stamp/1000));
SYSTEMTIME time = new SYSTEMTIME() ;
time.Year = (short)dateTime.Year;
time.Month = (short)dateTime.Month;
time.Day = (short)dateTime.Day;
time.DayOfWeek = (short)dateTime.DayOfWeek;
time.Hour = (short)(dateTime.Hour-8);
time.Minute = (short)dateTime.Minute;
time.Second = (short)dateTime.Second;
time.Miliseconds = (short)dateTime.Millisecond;
var a = SetSystemTime(ref time);
}