代码之家  ›  专栏  ›  技术社区  ›  user3226932

log15库将记录的历元时间从纳秒舍入到秒。

  •  -1
  • user3226932  · 技术社区  · 6 年前

    我想在我的Golang项目(目前使用的是log15库)中记录毫秒精度

    问题是,当我将它附加到上下文中时,它返回到秒。

    newTimeWithMilliseconds := time.Unix(0, time.Now().UnixNano())
    
    return log.FuncHandler(func(r *log.Record) {
         r.Ctx = append(r.Ctx, "time", newTimeWithMilliseconds)
         nextHandler.Log(r)
    })
    

    当我把它转换成字符串时 newTimeWithMilliseconds.String() 它起作用了,我得到 "2018-09-25 15:07:45.25801232 -0500 PDT" 但是当我不这样做的时候,小数就会消失 2018-09-25 15:07:45 -0700 PDT .

    我想保持时间格式,但不使用字符串,有谁知道为什么会发生这种情况以及如何解决这种情况?

    1 回复  |  直到 6 年前
        1
  •  3
  •   Ullaakut    6 年前

    你需要使用 time.Format 显示你的 time.Time 的值与所需的精度相同。除非您修改它的值,否则它不会降低精度,您看到差异的原因只是 layout 用于呼叫 time.Format 不管你在打印什么。

    当你使用 mytime.String() ,所使用的布局与任何人使用的布局都不同,否则将打印您的时间。

    这就是为什么你需要使用 时间,时间 值,但操作打印方式,或将其存储为格式化字符串。

    Go by example

    // Go supports time formatting and parsing via
    // pattern-based layouts.
    
    package main
    
    import "fmt"
    import "time"
    
    func main() {
        p := fmt.Println
    
        // Here's a basic example of formatting a time
        // according to RFC3339, using the corresponding layout
        // constant.
        t := time.Now()
        p(t.Format(time.RFC3339))
    
        // Time parsing uses the same layout values as `Format`.
        t1, e := time.Parse(
            time.RFC3339,
            "2012-11-01T22:08:41+00:00")
        p(t1)
    
        // `Format` and `Parse` use example-based layouts. Usually
        // you'll use a constant from `time` for these layouts, but
        // you can also supply custom layouts. Layouts must use the
        // reference time `Mon Jan 2 15:04:05 MST 2006` to show the
        // pattern with which to format/parse a given time/string.
        // The example time must be exactly as shown: the year 2006,
        // 15 for the hour, Monday for the day of the week, etc.
        p(t.Format("3:04PM"))
        p(t.Format("Mon Jan _2 15:04:05 2006"))
        p(t.Format("2006-01-02T15:04:05.999999-07:00"))
        form := "3 04 PM"
        t2, e := time.Parse(form, "8 41 PM")
        p(t2)
    
        // For purely numeric representations you can also
        // use standard string formatting with the extracted
        // components of the time value.
        fmt.Printf("%d-%02d-%02dT%02d:%02d:%02d-00:00\n",
            t.Year(), t.Month(), t.Day(),
            t.Hour(), t.Minute(), t.Second())
    
        // `Parse` will return an error on malformed input
        // explaining the parsing problem.
        ansic := "Mon Jan _2 15:04:05 2006"
        _, e = time.Parse(ansic, "8:41PM")
        p(e)
    }
    

    输出

    2009-11-10T23:00:00Z
    2012-11-01 22:08:41 +0000 UTC
    11:00PM
    Tue Nov 10 23:00:00 2009
    2009-11-10T23:00:00+00:00
    0000-01-01 20:41:00 +0000 UTC
    2009-11-10T23:00:00-00:00
    parsing time "8:41PM" as "Mon Jan _2 15:04:05 2006": cannot parse "8:41PM" as "Mon"
    

    你自己试试看 here