golang-Windows 设置系统本地时间

这篇具有很好参考价值的文章主要介绍了golang-Windows 设置系统本地时间。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

golang 调用win32api 对windows系统时间进行调用,主要参考的是微软的win32api文档,根据官方文档,有两者设置方式:
setlocaltime:设置当前的本地时间和日期。https://learn.microsoft.com/en-us/windows/win32/api/sysinfoapi/nf-sysinfoapi-setlocaltime
setsystemtime:设置当前系统时间和日期。系统时间以协调世界时 (UTC) 表示https://learn.microsoft.com/en-us/windows/win32/api/sysinfoapi/nf-sysinfoapi-setsystemtime

// 根据官方文档中的描述,setlocaltime 需要传一个输入参数,该参数是一个名为SYSTEMTIME的指针结构体
BOOL SetLocalTime(
  [in] const SYSTEMTIME *lpSystemTime
);

// SYSTEMTIME 定义:
typedef struct _SYSTEMTIME {
  WORD wYear;
  WORD wMonth;
  WORD wDayOfWeek;
  WORD wDay;
  WORD wHour;
  WORD wMinute;
  WORD wSecond;
  WORD wMilliseconds;
} SYSTEMTIME, *PSYSTEMTIME, *LPSYSTEMTIME;

// word 类型在golang 里面可以看作是 uint16
// SetLocalTime的返回值,如果设置成功,则返回值不是0,反之则为0

golang 调用win32api的方式 是通过 syscall 库去调用相应的 windows .dll 文件,根据上述文档描述,两个接口都是存在于 Kernel32.dll 这个文件当中,因此我们可以使用如下代码去实现调用接口:

dll2 := syscall.NewLazyDLL("kernel32.dll")
proc := dll2.NewProc("SetLocalTime")

具体实现方式如下: 

// 定义对应的结构体
type SYSTEMTIME struct {
	WYear         uint16
	WMonth        uint16
	WDayOfWeek    uint16
	WDay          uint16
	WHour         uint16
	WMinute       uint16
	WSecond       uint16
	WMilliseconds uint16
}

// 设置本地系统时间
func SetLocalTime(year, month, day, hour, minute, seconds uint16) error {
	s := SYSTEMTIME{
		WYear: year, WMonth: month, WDay: day, WHour: hour, WMinute: minute, WSecond: seconds,
	}
	fmt.Println("s", s)
	dll2 := syscall.NewLazyDLL("kernel32.dll")
	proc := dll2.NewProc("SetLocalTime")
    // 调用接口,传参
	r, _, err := proc.Call(uintptr(unsafe.Pointer(&s)))
	if r <= 0 {
		return err
	} else {
		return nil
	}
}

最后执行的话,需要在使用管理员权限在cmd 中执行才会成功.

下面是关于输入时间格式的一个校验,因为使用 SetLocalTime,对于输入时间系统不会做过多校验.我代码主要框架是gin.就不做过多修改了文章来源地址https://www.toymoban.com/news/detail-770633.html

func setTime(c *gin.Context) {
	var t struct {
		Year    uint16 `json:"year"`
		Month   uint16 `json:"month"`
		Day     uint16 `json:"day"`
		Hour    uint16 `json:"hour"`
		Minute  uint16 `json:"minute"`
		Seconds uint16 `json:"seconds"`
	}
	err := c.Bind(&t)
	if err != nil {
		c.JSON(200, utils.Returns(utils.ParamErr, err.Error(), c, nil, nil))
		return
	}
	msg := []string{}
	monthMap := map[uint16]string{
		1: "Jan", 2: "Feb", 3: "Mar", 4: "Apr", 5: "May", 6: "Jun", 7: "Jul",
		8: "Aug", 9: "Sep", 10: "Oct", 11: "Nov", 12: "Dec",
	}
	if t.Year < 1601 || t.Year > 30827 {
		msg = append(msg, "year range is from 1601 to 30827")
	}
	switch t.Month {
	case 1:
	case 3:
	case 5:
	case 7:
	case 8:
	case 10:
	case 12:
		if t.Day < 1 || t.Day > 31 {
			msg = append(msg, fmt.Sprintf("%d/%s of days range is from 1 to 31", t.Year, monthMap[t.Month]))
		}
	case 2:
		if t.Year%4 == 0 && t.Year%100 != 0 || t.Year%400 == 0 { // 闰年
			if t.Day < 1 || t.Day > 29 {
				msg = append(msg, fmt.Sprintf("%d/%s of days range is from 1 to 29", t.Year, monthMap[t.Month]))
			}
		} else { // 平年
			if t.Day < 1 || t.Day > 28 {
				msg = append(msg, fmt.Sprintf("%d/%s of days range is from 1 to 28", t.Year, monthMap[t.Month]))
			}
		}
	case 4:
	case 6:
	case 9:
	case 11:
		if t.Day < 1 || t.Day > 30 {
			msg = append(msg, fmt.Sprintf("%d/%s of days is ranges 1-30", t.Year, monthMap[t.Month]))
		}
	default:
		msg = append(msg, "month range is from 1 to 12")
	}
	if t.Hour < 0 || t.Hour > 59 {
		msg = append(msg, "hour range is from 0 to 59")
	}
	if t.Minute < 0 || t.Minute > 59 {
		msg = append(msg, "minute range is from 0 to 59")
	}
	if t.Seconds < 0 || t.Seconds > 59 {
		msg = append(msg, "seconds range is from  0 to 59")
	}
	if len(msg) > 0 {
		c.JSON(200, utils.Returns(utils.TimeRangeErr, strings.Join(msg, ","), c, nil, nil))
		return
	}
	err = utils.SetLocalTime(t.Year, t.Month, t.Day, t.Hour, t.Minute, t.Seconds)
	if err != nil {
		c.JSON(200, utils.Returns(utils.UpdateErr, err.Error(), c, nil, nil))
		return
	}
	c.JSON(200, utils.Returns(utils.Succ, "", c, nil, nil))
}

到了这里,关于golang-Windows 设置系统本地时间的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python,如何设置定时执行python代码-windows本地

    最近写了一个python小程序,希望能每天定时执行,但是又不想用jenkins这样的工具,后来发现windows本地就可以设置,而且很好用,具体步骤如下: 首先,需确保本地python代码已编写好,环境变量已配置好,能运行成功; 1)依次进入:控制面板-大图标-管理工具-任务计划程序

    2024年02月10日
    浏览(29)
  • Linux 操作系统——查看/修改系统时区、时间、本地时间修改为UTC

    最近一个项目日期采用java8的LocalDate 和 LocalDateTime ,在本地windows 下运行,日期没有问题,但是当部署到linux 系统上时,相差8 小时,第一时间想到时linux 服务器日期和时间设置的问题。果断登陆linux 服务器查看。 GMT(Greenwich Mean Time,格林威治标准时间): 是指位于英国伦敦郊区

    2024年02月07日
    浏览(56)
  • (Windows )本地连接远程服务器(Linux),免密码登录设置

    在使用VScode连接远程服务器时,每次打开都要输入密码,以及使用ssh登录或其它方法登录,都要本地输入密码,这大大降低了使用感受,下面总结了免密码登录的方法,用起来巴适得很,起飞。 本地必须在PowerShell终端操控,如下: 打开终端后在终端输入以下命令: 回车再回

    2024年02月11日
    浏览(41)
  • CentOS 设置系统时间与网络时间同步

    一、Linux的时间分为(两种) System Clock(系统时间) 指当前Linux Kernel中的时间 Real Time Clock (硬件时间,简称RTC) 主板上有电池供电的时间 二、查看系统时间的命令 系统时间指令: # date 设置系统时间的命令 三、查看硬件时间的命令: 硬件命令: # hwclock 设置硬件时间的命

    2024年03月09日
    浏览(34)
  • Python 使用http时间同步设置系统时间源码

    Python 方式实现使用http时间同步设置系统时间源码,系统环境是ubuntu 12.04、Python2.7版本。需要使用到time、os及httplib方法。 Python使用http时间同步设置系统时间,源码如下:

    2024年02月15日
    浏览(27)
  • adb - 设置系统时间

    app中添加系统定时重启功能,但是等待时间过久,故通过 adb 直接设置系统时间,方便验证功能。记录过程如下: 1、adb shell         进入终端 2、su           获取 root 权限 3、settings put global auto_time 0         关掉自动时间同步 4、 settings put global auto_time_zone       

    2024年04月26日
    浏览(28)
  • windows10下设置本地apache\nginx站点部署ssl证书,使本地配置的域名可以用https访问

    首先我们需要下载openssl来生成证书文件: 去官方网址下载https://slproweb.com/products/Win32OpenSSL.html; 下载好了,双击exe文件,然后就下一步,下一步安装完成; 安装之后配置环境变量,新建一个系统变量OPENSSL_HOME,值就是你安装目录下的bin,然后在系统变量path,增加%OPENSSL_HO

    2024年02月15日
    浏览(33)
  • CentOS 7 设置系统时间的方法

    CentOS 7 设置系统时间的方法分享。 一、设置系统时间为中国时区并启用NTP同步 二、硬件时钟和系统时钟 1、 硬件时钟 RTC(Real-Time Clock)或CMOS时钟,一般在主板上靠电池供电,服务器断电后也会继续运行。仅保存日期时间数值,无法保存时区和夏令时设置。 2、系统时钟 一般在

    2024年02月11日
    浏览(25)
  • 部署问题集合(二十二)Linux设置定时任务,并设置系统时间

    因为项目中经常用到定时任务,特此总结记录一下 大部分虚拟机创建后就自带定时服务,直接用命令就好 编辑定时任务: crontab -e ,在该文件下添加如下内容 开机自启: @reboot /home/autoRun.sh 定时执行: 0 0 * * * /home/sutoRun.sh (凌晨十二点执行) 时间后也可以接命令 若要在该

    2024年02月11日
    浏览(29)
  • 【嵌入式开发】开发板设置系统时间

    时钟包括硬件时钟和系统时钟,系统时钟就是linux系统显示的时间,用命令 date 可以显示当前系统时间;硬件时钟就是硬件自身的时间了。它们两者没有关系的,但是可以通过命令设置系统时钟和硬件设置,让它们同步。 Linux系统ARM架构开发板、Xshell软件 date 命令查看系统时

    2024年02月11日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包