У меня есть одна проблема: мне нужно знать разницу/длительность между двумя временными метками в golang. Поэтому я использую библиотеку времени (https://golang.org/pkg/time/).
Если у меня есть две метки времени типа «time.time», легко получить разницу, используя «time.Sub()». Моя проблема в том, что одна из моих временных меток исходит из другой функции, и ее можно передать только в виде строки:
t1 := "2009-11-10 23:00:00 +0000 UTC m=+0.000000001" //type: string
t2 := time.Now() //type: time.time
Теперь у меня есть основные возможности:
A) Преобразуйте t2 также в строку и попытайтесь найти разницу между двумя строками (UGLY)
B) Преобразуйте t1 из типа "string" в тип "time.time", а затем примените "time.Sub()"
Я хочу пойти по пути Б). Поэтому я узнал, что
time.Parse(format, timestring)
должен быть в состоянии сделать это. Итак, я попытался преобразовать t1, используя
t1_time, err := time.Parse(time.RFC3339, t1)
но результат не оправдал ожиданий! Вместо этого я получил это
0001-01-01 00:00:00 +0000 UTC
и ошибка, говорящая «время синтаксического анализа ошибки» 2009-11-10 23:00:02 +0000 UTC m=+2.000000001 как «2006-01-02T15:04:05Z07:00»: невозможно проанализировать «23:00:02 +0000 UTC m=+2.000000001" как "T"".
Если я использую свой собственный формат времени, который совпадает с t1
timeformat := "2009-11-10 23:00:00 +0000 UTC m=+0.000000001"
t1_time, err := time.Parse(timeformat , t1)
результат остается неверным, и я получаю сообщение об ошибке «время анализа ошибки» 2009-11-10 23:00:02 +0000 UTC m=+2.000000001 как «2009-11-10 23:00:00 +0000 UTC m= +0.000000001": невозможно проанализировать "9-11-10 23:00:02 +0000 UTC m=+2.000000001" как "009-" ".
Я также пытался пройти через время UNIX, но библиотека времени не позволяет мне преобразовать строку в unix.
Что я делаю не так??! Почему разбор не работает? Спасибо за любую помощь!
Вы не должны использовать "2009-11-10 23:00:00 +0000 UTC m=+0.000000001"
в качестве формата времени. Он не только менее удобен для разбора, но и не является стабильным форматом. Из документации: «Возвращаемая строка предназначена для отладка; для стабильного сериализованного представления используйте t.MarshalText
, t.MarshalBinary
или t.Format
с явной строкой формата».
так что вы хотите, чтобы ваше время (то, что в 2009 году) было в t1
. Но вы хотите, чтобы ваш формат был строковым форматом 2006
@Volker и @ Flimzy Мне очень любопытно. Дублирующая ссылка обрабатывает компоненты базового времени, но не охватывает монотонный компонент. Если кто-то время добавляет/вычитает, эта часть может быть весьма значительной. Интересно, действительно ли этот вопрос уникален в этом отношении?
@colminator: Вы предполагаете, что монотонная часть имеет отношение к ответу ОП? Я не вижу, чтобы это упоминалось. Если вопрос заключается в том, как анализировать монотонное время и/или как сравнивать эти части, он может быть уникальным. Но, как я понимаю, вопрос только в том, как выстроить/умхаршать время и как рассчитать разницу. Дубликаты должны ответить на это.
Разъяснения от ОП были бы очень кстати.
В основном вы хотите:
t1_raw := "2009-11-10 23:00:00 +0000 UTC m=+0.000000001"
format := "2006-01-02 15:04:05 -0700 MST"
// for simplicity t1_raw[:29] discards time's monotonic delta
// i.e. the " m=+0.000000001" suffix
t1, err := time.Parse(format, t1_raw[:29])
if err != nil {
log.Fatal(err)
}
log.Println("Duration ->", t2.Sub(t1))
Если вы В самом деле хотите включить монотонную дельту, это число нужно будет проанализировать вручную, а дельту применить к t1
.
Детская площадка версия.
Версия для игровой площадки Примечание: будет показывать нулевую продолжительность, поскольку часы игровой площадки начинаются с Nov 11 2009
— исходной даты рождения go
.
Спасибо @colminator! Это подходит для меня. Мне не нужна монотонная дельта, но она находится внутри исходного кода, который я использую, поэтому теперь я обрабатываю ее с помощью [:29]. Спасибо за вашу помощь!
go использует статический момент времени в качестве эталона для форматирования. В частности, см. golang.org/pkg/time/#pkg-константы: этот момент времени
Mon Jan 2 15:04:05 MST 2006
или в RFC3339"2006-01-02T15:04:05Z07:00"