Тип time.ParseError

Тип time.ParseError представляет ошибку, которая возникает при попытке разобрать строку времени с помощью функций time.Parse или time.ParseInLocation. Он содержит информацию о том, что пошло не так: ожидаемый формат, фактическая строка и позиция ошибки. Это позволяет разработчику точно определить причину неудачного разбора.

Структура типа

Тип time.ParseError имеет следующую структуру:

gotype ParseError struct {
  Layout   string
  Value    string
  LayoutElem string
  ValueElem  string
  msg    string
}

Поле Layout содержит ожидаемый формат разбора, Value - разбираемую строку, LayoutElem - элемент формата, на котором произошла ошибка, а ValueElem - соответствующий элемент строки, вызвавший ошибку.

Синтаксис

Тип time.ParseError не создается напрямую, а возвращается функциями разбора времени при неудаче. Обработка ошибки выполняется стандартным образом через проверку error:

go_, err := time.Parse(layout, value)
if err != nil {
  // обработка ошибки
}

Пример

Давайте попробуем разобрать строку времени с неправильным форматом:

gopackage main

import (
  "fmt"
  "time"
)

func main() {
  layout := "2006-01-02"
  value := "2023-13-01"
  _, err := time.Parse(layout, value)
  if err != nil {
    fmt.Println(err)
  }
}

Результат выполнения кода:

go"parsing time \"2023-13-01\" as \"2006-01-02\": cannot parse \"13-01\" as \"01\""

Ошибка сообщает, что разбор строки "2023-13-01" по формату "2006-01-02" не удался, потому что значение "13" не может быть разобрано как месяц.

Пример

Рассмотрим обработку ошибки с извлечением деталей через приведение типа:

gopackage main

import (
  "fmt"
  "time"
)

func main() {
  layout := "15:04:05"
  value := "25:60:00"
  _, err := time.Parse(layout, value)
  if parseErr, ok := err.(*time.ParseError); ok {
    fmt.Printf("Layout: %s\n", parseErr.Layout)
    fmt.Printf("Value: %s\n", parseErr.Value)
    fmt.Printf("LayoutElem: %s\n", parseErr.LayoutElem)
    fmt.Printf("ValueElem: %s\n", parseErr.ValueElem)
    fmt.Printf("Error: %s\n", parseErr.Error())
  }
}

Результат выполнения кода:

go"Layout: 15:04:05"
"Value: 25:60:00"
"LayoutElem: 15"
"ValueElem: 25"
"Error: parsing time \"25:60:00\" as \"15:04:05\": cannot parse \"25\" as \"15\""

Приведение типа позволяет получить доступ к отдельным полям ошибки, что помогает точно определить, какой элемент вызвал проблему.

Пример

Попробуем разобрать пустую строку времени:

gopackage main

import (
  "fmt"
  "time"
)

func main() {
  layout := time.RFC3339
  value := ""
  _, err := time.Parse(layout, value)
  if err != nil {
    fmt.Println(err)
  }
}

Результат выполнения кода:

go"parsing time \"\" as \"2006-01-02T15:04:05Z07:00\": cannot parse \"\" as \"2006\""

Ошибка указывает, что не удалось разобрать пустую строку, так как ожидается год в формате "2006".

Смотрите также

  • функцию time.Parse,
    которая разбирает строку времени по указанному формату
  • функцию time.ParseInLocation,
    которая разбирает строку времени с учетом временной зоны
  • функцию time.Now,
    которая возвращает текущее время
  • тип time.Time,
    который представляет момент времени