Преобразовать строку UTC в объект времени Голанга

У меня есть это время или что-то похожее на это.

2014-11-17 23:02:03 +0000 UTC

Я хочу преобразовать это в объект времени, и я не смог произвести какой-либо вывод изtime.Parse Помимо:

0001-01-01 00:00:00 +0000 UTC

Я пробовал эти макеты:

time.RFC3339
0001-01-01 00:00:00 0000 UTC
2016-10-10
time.UnixDate

И еще несколько - никто не работал.

Вот как я звонюparse :

updatedAt, err := time.Parse(time.UnixDate, updatedAtVar)

Как мне создать объект времени из строки?

Ответы на вопрос(2)

Вы, вероятно, используете неправильный макет. Как объяснено вtime.Parseнеобходимо указать макет, который поможет Go понять, как форматируется дата, прошедшая при вводе.

Есть предопределенные макеты (например, те, которые вы использовали), но ни один не соответствует вашему вводу. Следовательно, вам нужно определить пользовательский макет.

Макет использует следующую дату в качестве ссылки:

Mon Jan 2 15:04:05 MST 2006

Макет - это не что иное, как представление этой даты, которое соответствует представлению ваших входных данных:

t, err := time.Parse("2006-01-02 15:04:05 -0700 MST", "2014-11-17 23:02:03 +0000 UTC")

Также не забудьте проверитьerr за ошибки. Вероятно, ваши попытки вернули ошибку, но вы ее не проверяли.

package main

import (
    "fmt"
    "log"
    "time"
)

func main() {
    t, err := time.Parse("2006-01-02 15:04:05 -0700 UTC", "2014-11-17 23:02:03 +0000 UTC")
    if err != nil {
        log.Fatalln(err)
    }
    fmt.Println(t)
}
 praks543205 авг. 2016 г., 23:48
Да, я понимаю. Но то, что я делаю, используетtime.Now().String в качестве параметра URL. Затем я распаковываю этот параметр и пытаюсь преобразовать его обратно во время (это тест, который я пишу). Вывод, который я получаю изtime.Now().String после распаковки2014-11-17 23:02:03 0000 UTC, который не анализируется. Я знаю, что у меня неправильный макет. Я пытаюсь найти какой макет.
Решение Вопроса

вы использовали неправильный макет и не проверяли возвращенную ошибку.

В макете должна быть указана дата / время, в том формате, в котором вы вводите время:

Mon Jan 2 15:04:05 -0700 MST 2006

Смотрите этот рабочий код:

layout := "2006-01-02 15:04:05 -0700 MST"
t, err := time.Parse(layout, "2014-11-17 23:02:03 +0000 UTC")
fmt.Println(t, err)

Вывод (попробуйте наGo Playground):

2014-11-17 23:02:03 +0000 UTC <nil>

РЕДАКТИРОВАТЬ:

В свой вопрос вы включили+ войдите в ваше время ввода (как часть смещения зоны), но у вас есть ошибка со временем других форматов.

Time.String() использует следующую строку формата:

"2006-01-02 15:04:05.999999999 -0700 MST"

Так что либо используйте это для разбора времени, либо используйтеTime.Format() чтобы создать ваши строковые представления, где вы можете указать макет, чтобы вы могли использовать тот же макет для анализа строк времени.

2 тур:

Вы включаете свои временные строки в URL.+ Знак - это специальный символ в кодировке URL: он обозначает пробел. Итак+ конвертируется в пространство (и исчезает из строки времени). Используйте правильную кодировку URL! Проверьтеnet/url пакет иэтот пример.

 praks543205 авг. 2016 г., 23:55
Поэтому я передаю это время в качестве параметра URL. Когда я распаковываю это используяr.URL.Query()["updated_at"]Я получаю этот вывод. Я создаю время, как это -time.Now().String(), а также2014-11-17 23:02:03 0000 UTC это то, что возвращается ко мне в качестве параметра URL.
 icza05 авг. 2016 г., 23:44
@ praks5432 У вас пропал+ войдите в свой ввод, как часть смещения зоны.
 praks543206 авг. 2016 г., 00:17
оооооо это просто с помощьюurl.Encode на моем пути?
 praks543205 авг. 2016 г., 23:46
Я бы предпочел не брать время из моего URL, разбить его на части, добавить плюс, а затем преобразовать во время. Тамдолжен быть простым способом сделать это.
 icza06 авг. 2016 г., 00:14
@ praks5432 Вы ничего не сказали о включении времен в незашифрованных URL.+ это специальный символ, который означает пробел. Смотрите редактировать.
 icza05 авг. 2016 г., 23:52
@ praks5432 Смотрите отредактированный ответ.
 praks543205 авг. 2016 г., 23:40
lol..yes. Я использовал неправильный макет. Я понятия не имею, какой макет использовать. Я только что попробовал"2006-01-02 15:04:05 -0700 MST" и это тоже не сработало. Интересно, знает ли кто-нибудь, какой макет использовать, потому что это распространенный формат. Я буквально идуtime.Now(), преобразование его в String и передача его в распаковку (написание интеграционного теста)
 praks543205 авг. 2016 г., 23:43
Я вставил в2014-11-17 23:02:03 0000 UTC который является выходомtime.Now().String() (Я заморозил время - для теста) Я получаю эту ошибку на вашей детской площадке0001-01-01 00:00:00 +0000 UTC parsing time "2014-11-17 23:02:03 0000 UTC" as "2006-01-02 15:04:05 -0700 MST": cannot parse "UTC" as "-0700"
 praks543205 авг. 2016 г., 23:45
Да. Я знаю. Я не контролирую это. Я прохожу вtime.Now().String(), Это из го. Как мы можем иметь функцию в одном пакете, которая не будет принимать выходные данные другой функции в том же пакете, которая, кажется, предназначена для совместной работы?
 icza05 авг. 2016 г., 23:41
@ praks5432 Что ты имеешь в виду? Это не работает для вас? Нажмите на ссылку Playground в моем ответе и попробуйте сами.

Ваш ответ на вопрос