Как получить разницу между временными метками (либо между строками, либо time.time)

У меня есть одна проблема: мне нужно знать разницу/длительность между двумя временными метками в 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.

Что я делаю не так??! Почему разбор не работает? Спасибо за любую помощь!

go использует статический момент времени в качестве эталона для форматирования. В частности, см. golang.org/pkg/time/#pkg-константы: этот момент времени Mon Jan 2 15:04:05 MST 2006 или в RFC3339 "2006-01-02T15:04:05Z07:00"

colm.anseo 21.05.2019 17:00

Вы не должны использовать "2009-11-10 23:00:00 +0000 UTC m=+0.000000001" в качестве формата времени. Он не только менее удобен для разбора, но и не является стабильным форматом. Из документации: «Возвращаемая строка предназначена для отладка; для стабильного сериализованного представления используйте t.MarshalText, t.MarshalBinary или t.Format с явной строкой формата».

JimB 21.05.2019 17:00

так что вы хотите, чтобы ваше время (то, что в 2009 году) было в t1. Но вы хотите, чтобы ваш формат был строковым форматом 2006

colm.anseo 21.05.2019 17:01

@Volker и @ Flimzy Мне очень любопытно. Дублирующая ссылка обрабатывает компоненты базового времени, но не охватывает монотонный компонент. Если кто-то время добавляет/вычитает, эта часть может быть весьма значительной. Интересно, действительно ли этот вопрос уникален в этом отношении?

colm.anseo 22.05.2019 00:58

@colminator: Вы предполагаете, что монотонная часть имеет отношение к ответу ОП? Я не вижу, чтобы это упоминалось. Если вопрос заключается в том, как анализировать монотонное время и/или как сравнивать эти части, он может быть уникальным. Но, как я понимаю, вопрос только в том, как выстроить/умхаршать время и как рассчитать разницу. Дубликаты должны ответить на это.

Flimzy 22.05.2019 08:18

Разъяснения от ОП были бы очень кстати.

Flimzy 22.05.2019 08:18
В чем разница между методом "==" и equals()
В чем разница между методом "==" и equals()
Это один из наиболее часто задаваемых вопросов новичкам на собеседовании. Давайте обсудим его на примере.
Замена символа по определенному индексу в JavaScript
Замена символа по определенному индексу в JavaScript
В JavaScript существует несколько способов заменить символ в строке по определенному индексу.
1
6
536
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В основном вы хотите:

    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]. Спасибо за вашу помощь!

Chris 22.05.2019 08:49

Другие вопросы по теме