2016-08-05 5 views
2

У меня есть это datetime или что-то похожее на это.Преобразование строки UTC в объект времени golang

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) 

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

ответ

4

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

Схема должна быть эта дата/время в формате вашего времени вход:

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) 

Output (попробовать его на Go Playground):

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

EDIT:

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

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

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

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

второй раунд:

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

+0

lol..yes. Я использовал неправильный макет. Я понятия не имею, какой макет использовать. Я просто попробовал «2006-01-02 15:04:05 -0700 MST», и это тоже не сработало. Интересно, знал ли кто-нибудь, какой макет использовать, потому что это общий формат. Я буквально иду 'time.Now()', преобразовывая его в String и передавая его для распаковки (запись теста интеграции) – praks5432

+0

@ praks5432 Что значит? Это не работает для вас? Нажмите на ссылку «Игровая площадка» в своем ответе и попробуйте сами. – icza

+0

Я вставлял в '2014-11-17 23:02:03 0000 UTC', который является результатом' time.Now(). String() '(I замороженное время - для теста) Я получаю эту ошибку в ваша игровая площадка '0001-01-01 00:00:00 +0000 UTC время разбора" 2014-11-17 23:02:03 0000 UTC "as" 2006-01-02 15:04:05 -0700 MST ": не может разобрать «UTC» как «-0700» ' – praks5432

0

Возможно, вы используете неправильный макет. Как объясняется в 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) 
} 
+0

Да, я понимаю. Но то, что я делаю, используется 'time.Now(). String' как параметр url. Затем я распаковываю этот параметр и пытаюсь преобразовать его обратно (это тест, который я пишу). Выход, который я получаю из 'time.Now(). Строка', когда она распакована, - это '2014-11-17 23:02:03 0000 UTC', которая не анализируется. Я знаю, что у меня неправильный макет. Я пытаюсь найти макет. – praks5432

Смежные вопросы