Go:os.Stat ModTime显示不正确的值

时间:2014-10-16 13:25:04

标签: linux go

我试图在操作系统中一致地获得文件修改时间。 我正在创建一个文件,然后使用info := os.Stat(file)然后使用info.ModTime()

在Windows上,这看起来像预期的那样 - 文件修改时间现在等于 在Linux上,看起来该文件是在过去创建的(过去12秒确切)。

我应该提到我的Linux是一个虚拟机,使用this vagrant box

完整的脚本及其结果如下。

package main

import (
    "fmt"
    "io/ioutil"
    "os"
    "time"
)

func main() {
    fmt.Println("Started   :", time.Now())
    ioutil.WriteFile("somefile.txt", []byte("hello"), 0666)
    fi, _ := os.Stat("somefile.txt")
    fmt.Println("ModTime   :", fi.ModTime())
    fmt.Println("Now       :", time.Now())
    fmt.Println("Time Since:", time.Since(fi.ModTime()).Seconds())
}

Windows结果(按预期方式)

Started   : 2014-10-16 16:15:54.3861206 +0300 IDT
ModTime   : 2014-10-16 16:15:54.3880908 +0300 IDT
Now       : 2014-10-16 16:15:54.3880908 +0300 IDT
Time Since: 0

Linux结果(过去12秒)

Started   : 2014-10-16 13:15:23.511700545 +0000 UTC
ModTime   : 2014-10-16 13:15:11.1473256 +0000 UTC
Now       : 2014-10-16 13:15:23.514631479 +0000 UTC
Time Since: 12.367389917

对于我所缺少的任何帮助都会很棒。

编辑:
Execution on Travis不会重现错误

1 个答案:

答案 0 :(得分:1)

如果您没有运行NTP客户端来同步它,则虚拟机因时钟不同步而臭名昭着。

如果您的工作目录是实际主机的本地目录,并由Vagrant挂载到VM(这在开发时很常见),则主机文件系统将确定修改时间。如果VM和您的主机时钟相距足够分开,您将会发现这种情况。

在主机和VM系统上同时运行date以确定时钟之间的距离。