在日常工作中,有时可能会需要获取或修改客户端电脑的体系时间,比如软件设置了Licence有用期,预计2024-06-01 00:00:00到期,如果客户手动修改了客户端电脑时间,往前调整了一年,则软件就可以继续使用一年,云云循环往复,则Licence将形同虚设。以是有时间需要校验客户端电脑时间和服务器端时间,是否一致,如果不一致,则需要修改客户端电脑时间或进行体系提示。本文以一个简单的小例子,简述如何通过C#获取和设置客户端电脑的体系时间,仅供学习分享使用,如有不敷之处,还请指正。
涉及知识点
在windows体系中,设置体系时间,主要通过win32提供的API来实现,如下所示:
- SetLocalTime 设置体系的本地化时间
- GetLocalTime 获取体系的本地化时间
- SetSystemTime 设置体系的Utc时间
- GetSystemTime 获取体系的Utc时间
焦点代码
时间结构体
在上述四个体系函数中,都需要一个时间类型的结构体,包含时分秒,年代日。如下所示:- [StructLayout(LayoutKind.Sequential)]
- 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;
- public override string ToString()
- {
- return $"{wYear}-{wMonth}-{wDay} {wHour}:{wMinute}:{wSecond}.{wMilliseconds}";
- }
- }
复制代码
体系时间帮助类
为了方便调用,将4个体系函数进行封装到一个类中SysTimeHelper,如下所示:- public class SysTimeHelper
- {
- [DllImport("kernel32.dll")]
- public static extern bool SetSystemTime(ref SystemTime st);
- [DllImport("Kernel32.dll")]
- public static extern bool SetLocalTime(ref SystemTime st);
- [DllImport("Kernel32.dll")]
- public static extern void GetSystemTime(ref SystemTime st);
- [DllImport("Kernel32.dll")]
- public static extern void GetLocalTime(ref SystemTime st);
- public static string GetLocalTime()
- {
- SystemTime st = new SystemTime();
- GetLocalTime(ref st);
- return st.ToString();
- }
- public static bool SetLocalTimeByStr(string timestr)
- {
- bool flag = false;
- SystemTime sysTime = new SystemTime();
- DateTime dt = Convert.ToDateTime(timestr);
- sysTime.wYear = Convert.ToUInt16(dt.Year);
- sysTime.wMonth = Convert.ToUInt16(dt.Month);
- sysTime.wDay = Convert.ToUInt16(dt.Day);
- sysTime.wHour = Convert.ToUInt16(dt.Hour);
- sysTime.wMinute = Convert.ToUInt16(dt.Minute);
- sysTime.wSecond = Convert.ToUInt16(dt.Second);
- try
- {
- flag = SetLocalTime(ref sysTime);
- }
- catch (Exception ex)
- {
- string e = ex.Message;
- return false;
- }
- return flag;
- }
- /// <summary>
- /// 时间戳转为C#格式时间
- /// </summary>
- /// <param name=”timeStamp”></param>
- /// <returns></returns>
- public static DateTime ConvertStringToDateTime(string timeStamp)
- {
- DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
- long lTime = long.Parse(timeStamp + "0000");
- TimeSpan toNow = new TimeSpan(lTime);
- return dtStart.Add(toNow);
- }
- /// <summary>
- /// 时间戳转为C#格式时间10位
- /// </summary>
- /// <param name="timeStamp">Unix时间戳格式</param>
- /// <returns>C#格式时间</returns>
- public static DateTime GetDateTimeFrom1970Ticks(long curSeconds)
- {
- DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
- return dtStart.AddSeconds(curSeconds);
- }
- }
复制代码
函数调用
在页面调用时,即可通过SysTimeHelper帮助类,进行获取和修改体系时间。如下所示:
- public partial class MainWindow : Window
- {
- public MainWindow()
- {
- InitializeComponent();
- }
- private void Window_Loaded(object sender, RoutedEventArgs e)
- {
- var time = SysTimeHelper.GetLocalTime();
- this.txtTime.Text = time;
- }
- private void Button_Click(object sender, RoutedEventArgs e)
- {
- var time = this.txtTime.Text;
- bool flag = SysTimeHelper.SetLocalTimeByStr(time);
- if(flag)
- {
- MessageBox.Show("设置成功");
- }
- else
- {
- MessageBox.Show("设置失败");
- }
- }
- }
复制代码
实例演示
通过VS运行程序,在打开程序时,获取时间,然后手动修改时间,点击设置,如下所示:
如果设置过后,想要回复,可通过设置页面【同步时钟】进行规复,如下所示:
注意,如果在调试时,设置失败【SetLocalTime返回false】,可通过管理员方式运行Visual Studio,如下所示:
或者直接通过管理员身份运行程序,如下所示:
以上就是【C# 通过Win32API设置客户端体系时间】的全部内容,希望可以抛砖引玉,一起学习,共同进步。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |