我尝试使用 go 系统调用设置 Linux 系统时间和日期,但总是收到无效日期错误。当我在终端上执行调用时,日期可能是错误的,它总是成功结束。
\n这是我的测试代码:
\npackage main\n\nimport (\n "os/exec"\n "time"\n "os"\n "syscall"\n "fmt"\n)\n\nfunc main() {\n fiveDaysFromNow := time.Now().Add(time.Hour * 24 * 5)\n err := SetSystemDate(fiveDaysFromNow)\n if err != nil {\n fmt.Printf("Error: %s", err.Error())\n }\n}\n\nfunc SetSystemDate(newTime time.Time) error {\n binary, lookErr := exec.LookPath("date")\n if lookErr != nil {\n fmt.Printf("Date binary not found, cannot set system date: %s\\n", lookErr.Error())\n return lookErr\n } else {\n //dateString := newTime.Format("2006-01-2 15:4:5")\n dateString := newTime.Format("2 Jan 2006 15:04:05")\n fmt.Printf("Setting system date to: %s\\n", dateString)\n args := []string{"--set", dateString}\n env := os.Environ()\n return syscall.Exec(binary, args, env)\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n我得到的输出是:
\n\n\n将系统日期设置为:2018 年 2 月 26 日 13:36:52
\n--set: 无效日期 \xe2\x80\x9826 2018 年 2 月 13:36:52\xe2\x80\x99
\n进程已完成,退出代码为 1
\n
在终端中执行:
\ndate -s '26 Feb 2018 13:36:52'\nRun Code Online (Sandbox Code Playgroud)\n尽管如此,还是成功了,没有任何问题。
\n我正在安装了 KDE 的 Ubuntu 16.04.3 LTS 上对此进行测试,但这将在具有自定义 Yocto Yogurt 映像的嵌入式设备上使用。会有什么不同吗?
\n使用syscall.Exec()时是否需要对日期字符串使用不同的格式?
\n@JimB 和 @Tim Cooper 你是对的,使用 os/exec 就像一个魅力......
这是现在更新的功能:
func SetSystemDate(newTime time.Time) error {
_, lookErr := exec.LookPath("date")
if lookErr != nil {
fmt.Printf("Date binary not found, cannot set system date: %s\n", lookErr.Error())
return lookErr
} else {
//dateString := newTime.Format("2006-01-2 15:4:5")
dateString := newTime.Format("2 Jan 2006 15:04:05")
fmt.Printf("Setting system date to: %s\n", dateString)
args := []string{"--set", dateString}
return exec.Command("date", args...).Run()
}
}
Run Code Online (Sandbox Code Playgroud)