Библиотека log15 округляет время эпохи от наносекунд до секунд для регистрации - PullRequest
0 голосов
/ 26 сентября 2018

Я хотел бы иметь точность в миллисекунды для своей регистрации в моем проекте golang, в настоящее время использующей библиотеку log15

Проблема в том, что когда я добавляю его в Context, он округляется до секунд

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 Ответ

0 голосов
/ 26 сентября 2018

Вам необходимо использовать time.Format для отображения значения time.Time с необходимой вам точностью.Он не теряет свою точность, пока вы не измените его значение, причина, по которой вы видите разницу, заключается только в layout, используемом вызовом для time.Format того, что печатает ваше время.

Когдавы используете mytime.String(), используемый макет отличается от того, который используется любым другим способом, печатающим ваше время.

Вот почему вам нужно либо использовать значение time.Time, но и манипулировать способом его печати или сохранитьвместо этого это как отформатированная строка.

См. Пример использования

// 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"

Попробуйте сами здесь

...