如何通过系统调用设置系统日期和时间

时间:2018-02-21 12:54:49

标签: go

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

这是我的测试代码:

package main

import (
    "os/exec"
    "time"
    "os"
    "syscall"
    "fmt"
)

func main() {
    fiveDaysFromNow := time.Now().Add(time.Hour * 24 * 5)
    err := SetSystemDate(fiveDaysFromNow)
    if err != nil {
        fmt.Printf("Error: %s", err.Error())
    }
}

func SetSystemDate(newTime time.Time) error {
    binary, 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}
        env := os.Environ()
        return syscall.Exec(binary, args, env)
    }
}

我得到的输出是:

  

将系统日期设置为:2018年2月26日13:36:52

     

- 设置:无效日期'26 Feb 2018 13:36:52'

     

使用退出代码1完成处理

在终端执行:

date -s '26 Feb 2018 13:36:52'
然而,成功没有任何问题。

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

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

1 个答案:

答案 0 :(得分:2)

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