如何通过 go syscall 设置系统日期和时间

S. *_*mir 3 go

我尝试使用 go 系统调用设置 Linux 系统时间和日期,但总是收到无效日期错误。当我在终端上执行调用时,日期可能是错误的,它总是成功结束。

\n

这是我的测试代码:

\n
package 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}\n
Run Code Online (Sandbox Code Playgroud)\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
\n

在终端中执行:

\n
date -s '26 Feb 2018 13:36:52'\n
Run Code Online (Sandbox Code Playgroud)\n

尽管如此,还是成功了,没有任何问题。

\n

我正在安装了 KDE 的 Ubuntu 16.04.3 LTS 上对此进行测试,但这将在具有自定义 Yocto Yogurt 映像的嵌入式设备上使用。会有什么不同吗?

\n

使用syscall.Exec()时是否需要对日期字符串使用不同的格式?

\n

S. *_*mir 5

@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)