Go время разбора на строку и обратно - PullRequest
0 голосов
/ 29 февраля 2020

Я пытаюсь сделать что-то в Go, что очень просто в таких языках, как Java

Я хочу проанализировать текущее время в строку, а затем проанализировать его обратно во время.

Это код, который я пробовал, но, как видно здесь , он дает неожиданные результаты.

У меня две проблемы

  1. time.Now (). String () дает неправильную дату
  2. Если я приведу время к строке и приведу обратно время дает совершенно другую дату.

Как правильно (и легко) это сделать?

        p := fmt.Println
startStr := time.Now().String()   //2009-11-10 23:00:00 +0000 UTC m=+0.000000001
p(startStr)

startTime, _ := time.Parse(
    "2009-11-10 23:00:00 +0000 UTC m=+0.000000001",
    startStr)

p(startTime)             //0001-01-01 00:00:00 +0000 UTC

Ответы [ 3 ]

5 голосов
/ 29 февраля 2020

time.Now().String() предназначен только для отладки (см. go doc).

Вместо этого следует использовать time.Format().

Например:

    p := fmt.Println
    now := time.Now().Format(time.RFC3339)
    p(now)

    parsed, _ := time.Parse(time.RFC3339, now)
    p(parsed.Format(time.RFC3339))

производит:

2009-11-10T23:00:00Z
2009-11-10T23:00:00Z

Ваша другая проблема относительно time.Now().String() gives a wrong date, вероятно, связана с тем, где вы запускаете код. например, если вы работаете в «Go Playgounrd», то время не будет точным. Вы должны запустить его на своем собственном компьютере, и, если ваш компьютер имеет правильное время, тогда вы должны напечатать правильное время.

2 голосов
/ 29 февраля 2020

В отличие от некоторых других языков, Go не рассматривает String () как метод де-факто маршалинга - вместо этого он предназначен просто для вывода значения в целях отладки. Вы можете разобрать этот формат в Time, если вы использовали правильную строку формата; тем не менее, правильная строка формата должна иметь точное время Mon Jan 2 15:04:05 MST 2006, а не любое время; но формат, который выводит String (), не фиксируется константой в пакете Time, поэтому, вероятно, это не стоит делать.

Вместо этого, однако, то, что вы пытаетесь сделать, может быть лучше захвачено Методы MarshalText и UnmarshalText:

startStr, _ := time.Now().MarshalText()
fmt.Println(string(startStr)) // 2009-11-10T23:00:00Z

startTime := new(time.Time)
startTime.UnmarshalText(startStr)

fmt.Println(startTime) // 2009-11-10 23:00:00 +0000 UTC
0 голосов
/ 29 февраля 2020

Время на игровой площадке фиксированное, это всегда дата и время объявления Go.

https://github.com/golang/go/issues/10663

Так что, чтобы правильно поиграть со временем, вам нужно запустить его на своем месте.

При разборе времени на строку или обратно вы должны передать формат строки времени: Например:

package main

import (
    "fmt"
    "time"
)

func main() {
    current := time.Now()
    fmt.Println("Init Time:", current.String())
    timeCustomFormatStr := current.Format("2006-01-02 15:04:05 -0700")
    fmt.Println("Custom format", timeCustomFormatStr)
    parsedTime, err := time.Parse("2006-01-02 15:04:05 -0700",timeCustomFormatStr)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println("parsedTime From Custom:", parsedTime)

    timeFormatRFC3339 := current.Format(time.RFC3339)
    fmt.Println("RFC3339 format", timeFormatRFC3339)

    parsedTimeRFC3339, err := time.Parse(time.RFC3339,timeFormatRFC3339)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println("parsedTime From Custom:", parsedTimeRFC3339)
}

Ссылка: 1 https://golang.org/pkg/time/#Time .Format

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...