cpp

Работа с датой и временем

Основные функции и методы для работы с датой и временем в языке Go определены в пакете time. Не забудьте добавить следующую инструкцию в начало программы:

import "time"

Структура Time

Структура Time описывает момент времени с точностью до наносекунды.

Создание объекта

Создать экземпляр структуры Time позволяют следующие функции:

  • Now() — создает объект с текущими датой и временем. Формат функции:
time.Now() time.Time

Пример:

t := time.Now()
fmt.Printf("%T\n", t) // time.Time
fmt.Println(t.String())
// 2022-03-21 22:46:01.883859 +0300 MSK m=+0.002001301
  • UnixMicro() — создает объект на основе количества микросекунд, прошедших с начала эпохи (с 1 января 1970 г.). Формат функции:
time.UnixMicro(usec int64) time.Time

Пример:

t := time.UnixMicro(1647892187180503)
fmt.Println(t.String())
// 2022-03-21 22:49:47.180503 +0300 MSK
  • UnixMilli() — создает объект на основе количества миллисекунд, прошедших с начала эпохи (с 1 января 1970 г.). Формат функции:
time.UnixMilli(msec int64) time.Time

Пример:

t := time.UnixMilli(1647892187180)
fmt.Println(t.String())
// 2022-03-21 22:49:47.18 +0300 MSK
  • Unix() — создает объект на основе количества секунд, прошедших с начала эпохи (с 1 января 1970 г.), и наносекунд. Формат функции:
time.Unix(sec int64, nsec int64) time.Time

Пример:

t := time.Unix(1647892187, 0)
fmt.Println(t.String())
// 2022-03-21 22:49:47 +0300 MSK
  • Date() — создает объект на основе отдельных значений даты и времени. Формат функции:
time.Date(year int, month time.Month, day int, hour int, min int,
          sec int, nsec int, loc *time.Location) time.Time

Тип Month является синонимом типа int. В параметре loc можно указать переменную Local или UTC. Пример:

t := time.Date(2022, 3, 21, 22, 49, 47, 0, time.Local)
fmt.Println(t.String())
// 2022-03-21 22:49:47 +0300 MSK
  • Parse() — создает объект на основе строки с датой и временем. Формат функции:
time.Parse(layout string, value string) (time.Time, error)

В первом параметре указывается строка формата, а во втором параметре — строка с датой и временем. Функция возвращает два значения. Через первое значение доступен объект структуры Time, а через второе — сообщение об ошибке или nil, если ошибки не возникло. Пример:

t, err := time.Parse(time.RFC1123Z,
                     "Mon, 21 Mar 2022 22:49:47 +0300")
fmt.Println(t.String()) // 2022-03-21 22:49:47 +0300 MSK
fmt.Println(err)        // <nil>

В первом параметре можно указать следующие константы:

fmt.Println(time.Layout)      // 01/02 03:04:05PM '06 -0700
fmt.Println(time.ANSIC)       // Mon Jan _2 15:04:05 2006
fmt.Println(time.UnixDate)    // Mon Jan _2 15:04:05 MST 2006
fmt.Println(time.RubyDate)    // Mon Jan 02 15:04:05 -0700 2006
fmt.Println(time.RFC822)      // 02 Jan 06 15:04 MST
fmt.Println(time.RFC822Z)     // 02 Jan 06 15:04 -0700
fmt.Println(time.RFC850)      // Monday, 02-Jan-06 15:04:05 MST
fmt.Println(time.RFC1123)     // Mon, 02 Jan 2006 15:04:05 MST
fmt.Println(time.RFC1123Z)    // Mon, 02 Jan 2006 15:04:05 -0700
fmt.Println(time.RFC3339)     // 2006-01-02T15:04:05Z07:00
fmt.Println(time.RFC3339Nano)
// 2006-01-02T15:04:05.999999999Z07:00
fmt.Println(time.Kitchen)         // 3:04PM
fmt.Println(time.Stamp)           // Jan _2 15:04:05
fmt.Println(time.StampMilli)      // Jan _2 15:04:05.000
fmt.Println(time.StampMicro)      // Jan _2 15:04:05.000000
fmt.Println(time.StampNano)       // Jan _2 15:04:05.000000000
  • ParseInLocation() — аналогична функции Parse(), но дополнительно позволяет указать временную зону. Формат функции:
time.ParseInLocation(layout string, value string,
                     loc *time.Location) (time.Time, error)

Пример:

t, err := time.ParseInLocation("02 Jan 2006 15:04:05",
                       "21 Mar 2022 22:49:47", time.Local)
fmt.Println(t.String()) // 2022-03-21 22:49:47 +0300 MSK
fmt.Println(err)        // <nil>

Проверить, является ли объект нулевым, позволяет метод IsZero(). Формат метода:

(time.Time).IsZero() bool

Пример:

t := time.Date(2022, 3, 21, 22, 49, 47, 0, time.UTC)
fmt.Println(t.IsZero()) // false
var t2 time.Time
fmt.Println(t2.IsZero()) // true

Преобразование объекта в метку времени UNIX

Преобразовать объект в метку времени UNIX позволяют следующие методы:

  • Unix() — возвращает количество секунд, прошедших с начала эпохи (с 1 января 1970 г.). Формат метода:
(time.Time).Unix() int64

Пример:

t := time.Date(2022, 3, 21, 22, 49, 47, 0, time.Local)
fmt.Println(t.Unix()) // 1647892187
  • UnixMilli() — возвращает количество миллисекунд, прошедших с начала эпохи (с 1 января 1970 г.). Формат метода:
(time.Time).UnixMilli() int64

Пример:

t := time.Date(2022, 3, 21, 22, 49, 47, 0, time.Local)
fmt.Println(t.UnixMilli()) // 1647892187000
  • UnixMicro() — возвращает количество микросекунд, прошедших с начала эпохи (с 1 января 1970 г.). Формат метода:
(time.Time).UnixMicro() int64

Пример:

t := time.Date(2022, 3, 21, 22, 49, 47, 0, time.Local)
fmt.Println(t.UnixMicro()) // 1647892187000000
  • UnixNano() — возвращает количество наносекунд, прошедших с начала эпохи (с 1 января 1970 г.). Формат метода:
(time.Time).UnixNano() int64

Пример:

t := time.Date(2022, 3, 21, 22, 49, 47, 0, time.Local)
fmt.Println(t.UnixNano()) // 1647892187000000000

Преобразование объекта в строку

Преобразовать объект в строку позволяют следующие методы:

  • String() — возвращает строковое значение объекта в формате "2006-01-02 15:04:05.999999999 -0700 MST". Формат метода:
(time.Time).String() string

Пример:

t := time.Date(2022, 3, 21, 22, 49, 47, 0, time.Local)
fmt.Println(t.String()) // 2022-03-21 22:49:47 +0300 MSK
  • Format() — возвращает строковое значение объекта в соответствии со строкой формата layout. Формат метода:
(time.Time).Format(layout string) string

Пример:

t := time.Date(2022, 3, 21, 22, 49, 47, 0, time.Local)
fmt.Println(t.Format("2006-01-02 15:04:05.999999999 -0700 MST"))
// 2022-03-21 22:49:47 +0300 MSK
fmt.Println(t.Format("02-01-2006 15:04:05"))
// 21-03-2022 22:49:47
fmt.Println(t.Format("02.01.2006 15:04:05"))
// 21.03.2022 22:49:47

В качестве параметра layout можно указать следующие константы:

t := time.Date(2022, 3, 21, 22, 49, 47, 0, time.Local)
fmt.Println(t.Format(time.Layout))
// 03/21 10:49:47PM '22 +0300
fmt.Println(t.Format(time.ANSIC))
// Mon Mar 21 22:49:47 2022
fmt.Println(t.Format(time.UnixDate))
// Mon Mar 21 22:49:47 MSK 2022
fmt.Println(t.Format(time.RubyDate))
// Mon Mar 21 22:49:47 +0300 2022
fmt.Println(t.Format(time.RFC822))
// 21 Mar 22 22:49 MSK
fmt.Println(t.Format(time.RFC822Z))
// 21 Mar 22 22:49 +0300
fmt.Println(t.Format(time.RFC850))
// Monday, 21-Mar-22 22:49:47 MSK
fmt.Println(t.Format(time.RFC1123))
// Mon, 21 Mar 2022 22:49:47 MSK
fmt.Println(t.Format(time.RFC1123Z))
// Mon, 21 Mar 2022 22:49:47 +0300
fmt.Println(t.Format(time.RFC3339))
// 2022-03-21T22:49:47+03:00
fmt.Println(t.Format(time.RFC3339Nano))
// 2022-03-21T22:49:47+03:00
fmt.Println(t.Format(time.Kitchen))
// 10:49PM
fmt.Println(t.Format(time.Stamp))
// Mar 21 22:49:47
fmt.Println(t.Format(time.StampMilli))
// Mar 21 22:49:47.000
fmt.Println(t.Format(time.StampMicro))
// Mar 21 22:49:47.000000
fmt.Println(t.Format(time.StampNano))
// Mar 21 22:49:47.000000000
  • GoString() — возвращает строковое представление объекта в специальном формате. Формат метода:
(time.Time).GoString() string

Пример:

t := time.Date(2022, 3, 21, 22, 49, 47, 0, time.Local)
fmt.Println(t.GoString())
// time.Date(2022, time.March, 21, 22, 49, 47, 0, time.Local)
  • AppendFormat() — добавляет в байтовый слайс b значение объекта в соответствии со строкой формата layout и возвращает новый слайс. Формат метода:
(time.Time).AppendFormat(b []byte, layout string) []byte

Пример:

b := []byte("Date: ")
t := time.Date(2022, 3, 21, 22, 49, 47, 0, time.Local)
b = t.AppendFormat(b, "02.01.2006 15:04:05")
fmt.Println(string(b)) // Date: 21.03.2022 22:49:47
  • MarshalBinary() — возвращает байтовый слайс в специальном формате и описание ошибки или nil, если ошибки не возникло. Формат метода:
(time.Time).MarshalBinary() ([]byte, error)

Пример:

t := time.Date(2022, 3, 21, 22, 49, 47, 0, time.Local)
b, err := t.MarshalBinary()
fmt.Printf("%q\n", b)
// "\x01\x00\x00\x00\x0e\xd9\xca\xcd\xdb\x00\x00\x00\x00\x00\xb4"
fmt.Println(err) // <nil>

Выполнить обратную операцию позволяет метод UnmarshalBinary(). Формат метода:

(*time.Time).UnmarshalBinary(data []byte) error

Пример:

t := time.Date(2000, 1, 1, 1, 1, 1, 0, time.Local)
b := []byte("\x01\x00\x00\x00\x0e\xd9\xca\xcd" +
            "\xdb\x00\x00\x00\x00\x00\xb4")
fmt.Println(t.UnmarshalBinary(b)) // <nil>
fmt.Println(t.String()) // 2022-03-21 22:49:47 +0300 MSK
  • MarshalJSON() — возвращает байтовый слайс в специальном формате и описание ошибки или nil, если ошибки не возникло. Формат метода:
(time.Time).MarshalJSON() ([]byte, error)

Пример:

t := time.Date(2022, 3, 21, 22, 49, 47, 0, time.Local)
b, err := t.MarshalJSON()
fmt.Printf("%q\n", b)  // "\"2022-03-21T22:49:47+03:00\""
fmt.Println(err)       // <nil>

Выполнить обратную операцию позволяет метод UnmarshalJSON(). Формат метода:

(*time.Time).UnmarshalJSON(data []byte) error

Пример:

t := time.Date(2000, 1, 1, 1, 1, 1, 0, time.Local)
b := []byte("\"2022-03-21T22:49:47+03:00\"")
fmt.Println(t.UnmarshalJSON(b)) // <nil>
fmt.Println(t.String()) // 2022-03-21 22:49:47 +0300 MSK
  • MarshalText() — возвращает байтовый слайс в специальном формате и описание ошибки или nil, если ошибки не возникло. Формат метода:
(time.Time).MarshalText() ([]byte, error)

Пример:

t := time.Date(2022, 3, 21, 22, 49, 47, 0, time.Local)
b, err := t.MarshalText()
fmt.Printf("%q\n", b) // "2022-03-21T22:49:47+03:00"
fmt.Println(err)      // <nil>

Выполнить обратную операцию позволяет метод UnmarshalText(). Формат метода:

(*time.Time).UnmarshalText(data []byte) error

Пример:

t := time.Date(2000, 1, 1, 1, 1, 1, 0, time.Local)
b := []byte("2022-03-21T22:49:47+03:00")
fmt.Println(t.UnmarshalText(b)) // <nil>
fmt.Println(t.String()) // 2022-03-21 22:49:47 +0300 MSK
  • GobEncode() — возвращает байтовый слайс в специальном формате и описание ошибки или nil, если ошибки не возникло. Формат метода:
(time.Time).GobEncode() ([]byte, error)

Пример:

t := time.Date(2022, 3, 21, 22, 49, 47, 0, time.Local)
b, err := t.GobEncode()
fmt.Printf("%q\n", b)
// "\x01\x00\x00\x00\x0e\xd9\xca\xcd\xdb\x00\x00\x00\x00\x00\xb4"
fmt.Println(err) // <nil>

Выполнить обратную операцию позволяет метод GobDecode(). Формат метода:

(*time.Time).GobDecode(data []byte) error

Пример:

t := time.Date(2000, 1, 1, 1, 1, 1, 0, time.Local)
b := []byte("\x01\x00\x00\x00\x0e\xd9\xca" +
            "\xcd\xdb\x00\x00\x00\x00\x00\xb4")
fmt.Println(t.GobDecode(b)) // <nil>
fmt.Println(t.String())     // 2022-03-21 22:49:47 +0300 MSK

Получение отдельных значений даты и времени

Получить отдельные значения даты и времени позволяют следующие методы:

  • Date() — возвращает год, месяц и день. Формат метода:
(time.Time).Date() (year int, month time.Month, day int)

Пример:

t := time.Date(2022, 3, 21, 22, 49, 47, 0, time.Local)
year, month, day := t.Date()
fmt.Println(year, month, day) // 2022 March 21
  • Year() — возвращает год. Формат метода:
(time.Time).Year() int

Пример:

t := time.Date(2022, 3, 21, 22, 49, 47, 0, time.Local)
fmt.Println(t.Year()) // 2022
  • ISOWeek() — возвращает год и номер недели в году. Формат метода:
(time.Time).ISOWeek() (year int, week int)

Пример:

t := time.Date(2022, 3, 21, 22, 49, 47, 15, time.Local)
year, week := t.ISOWeek()
fmt.Println(year, week) // 2022 12
  • Month() — возвращает месяц. Формат метода:
(time.Time).Month() time.Month

Пример:

t := time.Date(2022, time.March, 21, 22, 49, 47, 0, time.Local)
month := t.Month()
fmt.Println(month)          // March
fmt.Println(month.String()) // March
fmt.Println(int(month))     // 3

Тип Month является синонимом типа int. Он содержит метод String(), который возвращает название месяца на английском языке. Для месяцев существуют следующие константы:

fmt.Println(time.January)   // January
fmt.Println(time.February)  // February
fmt.Println(time.March)     // March
fmt.Println(time.April)     // April
fmt.Println(time.May)       // May
fmt.Println(time.June)      // June
fmt.Println(time.July)      // July
fmt.Println(time.August)    // August
fmt.Println(time.September) // September
fmt.Println(time.October)   // October
fmt.Println(time.November)  // November
fmt.Println(time.December)  // December
  • Day() — возвращает день месяца. Формат метода:
(time.Time).Day() int

Пример:

t := time.Date(2022, 3, 21, 22, 49, 47, 0, time.Local)
fmt.Println(t.Day()) // 21
  • YearDay() — возвращает день в году. Формат метода:
(time.Time).YearDay() int

Пример:

t := time.Date(2022, 3, 21, 22, 49, 47, 0, time.Local)
fmt.Println(t.YearDay()) // 80
  • Weekday() — возвращает день недели. Формат метода:
(time.Time).Weekday() time.Weekday

Пример:

t := time.Date(2022, 3, 21, 22, 49, 47, 0, time.Local)
weekday := t.Weekday()
fmt.Println(weekday)          // Monday
fmt.Println(weekday.String()) // Monday
fmt.Println(int(weekday))     // 1

Тип Weekday является синонимом типа int. Воскресенье имеет значение 0, понедельник — 1, а суббота — 6. Тип Weekday содержит метод String(), который возвращает название дня недели на английском языке. Для дней недели существуют следующие константы:

fmt.Println(time.Monday)      // Monday
fmt.Println(time.Tuesday)     // Tuesday
fmt.Println(time.Wednesday)   // Wednesday
fmt.Println(time.Thursday)    // Thursday
fmt.Println(time.Friday)      // Friday
fmt.Println(time.Saturday)    // Saturday
fmt.Println(time.Sunday)      // Sunday
fmt.Println(int(time.Sunday)) // 0
fmt.Println(int(time.Monday)) // 1
  • Clock() — возвращает часы, минуты и секунды. Формат метода:
(time.Time).Clock() (hour int, min int, sec int)

Пример:

t := time.Date(2022, 3, 21, 22, 49, 47, 0, time.Local)
hour, min, sec := t.Clock()
fmt.Println(hour, min, sec) // 22 49 47
  • Hour() — возвращает часы. Формат метода:
(time.Time).Hour() int

Пример:

t := time.Date(2022, 3, 21, 22, 49, 47, 0, time.Local)
fmt.Println(t.Hour()) // 22
  • Minute() — возвращает минуты. Формат метода:
(time.Time).Minute() int

Пример:

t := time.Date(2022, 3, 21, 22, 49, 47, 0, time.Local)
fmt.Println(t.Minute()) // 49
  • Second() — возвращает секунды. Формат метода:
(time.Time).Second() int

Пример:

t := time.Date(2022, 3, 21, 22, 49, 47, 0, time.Local)
fmt.Println(t.Second()) // 47
  • Nanosecond() — возвращает наносекунды. Формат метода:
(time.Time).Nanosecond() int

Пример:

t := time.Date(2022, 3, 21, 22, 49, 47, 15, time.Local)
fmt.Println(t.Nanosecond()) // 15
  • Zone() — возвращает название временной зоны и смещение в секундах. Формат метода:
(time.Time).Zone() (name string, offset int)

Пример:

t := time.Date(2022, 3, 21, 22, 49, 47, 15, time.Local)
name, offset := t.Zone()
fmt.Println(name, offset) // MSK 10800
  • Location() — возвращает временную зону. Формат метода:
(time.Time).Location() *time.Location

Пример:

t := time.Date(2022, 3, 21, 22, 49, 47, 15, time.Local)
fmt.Println(t.Location()) // Local
t = time.Date(2022, 3, 21, 22, 49, 47, 15, time.UTC)
fmt.Println(t.Location()) // UTC

Выведем текущую дату и время таким образом, чтобы день недели и месяц были написаны по-русски (листинг 9.1).

Листинг 9.1. Вывод текущей даты и времени

package main

import (
   "fmt"
   "time"
)

func main() {
   d := []string{"воскресенье", "понедельник", "вторник",
                 "среда", "четверг", "пятница", "суббота"}
   m := []string{"", "января", "февраля", "марта", "апреля", "мая",
                 "июня", "июля", "августа", "сентября", "октября",
                 "ноября", "декабря"}
   t := time.Now()
   fmt.Println("Сегодня:")
   fmt.Printf("%s %d %s %d %s\n", d[t.Weekday()], t.Day(),
              m[t.Month()], t.Year(), t.Format("15:04:05"))
   fmt.Println(t.Format("02.01.2006"))
}

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

Сегодня:
вторник 22 марта 2022 23:22:31
22.03.2022

Сравнение объектов

Сравнить два объекта позволяют следующие методы:

  • Equal() — возвращает true, если объекты равны, и false — в противном случае. Формат метода:
(time.Time).Equal(u time.Time) bool

Пример:

t := time.Date(2022, 3, 21, 22, 49, 47, 0, time.Local)
t1 := time.Date(2022, 3, 21, 22, 49, 47, 0, time.Local)
t2 := time.Date(2020, 3, 21, 22, 49, 47, 0, time.Local)
t3 := time.Date(2024, 3, 21, 22, 49, 47, 0, time.Local)
fmt.Println(t.Equal(t1)) // true
fmt.Println(t.Equal(t2)) // false
fmt.Println(t.Equal(t3)) // false
  • After() — возвращает true, если текущий объект больше указанного в параметре объекта, и false — в противном случае. Формат метода:
(time.Time).After(u time.Time) bool

Пример:

t := time.Date(2022, 3, 21, 22, 49, 47, 0, time.Local)
t1 := time.Date(2022, 3, 21, 22, 49, 47, 0, time.Local)
t2 := time.Date(2020, 3, 21, 22, 49, 47, 0, time.Local)
t3 := time.Date(2024, 3, 21, 22, 49, 47, 0, time.Local)
fmt.Println(t.After(t1)) // false
fmt.Println(t.After(t2)) // true
fmt.Println(t.After(t3)) // false
  • Before() — возвращает true, если текущий объект меньше указанного в параметре объекта, и false — в противном случае. Формат метода:
(time.Time).Before(u time.Time) bool

Пример:

t := time.Date(2022, 3, 21, 22, 49, 47, 0, time.Local)
t1 := time.Date(2022, 3, 21, 22, 49, 47, 0, time.Local)
t2 := time.Date(2020, 3, 21, 22, 49, 47, 0, time.Local)
t3 := time.Date(2024, 3, 21, 22, 49, 47, 0, time.Local)
fmt.Println(t.Before(t1)) // false
fmt.Println(t.Before(t2)) // false
fmt.Println(t.Before(t3)) // true

Преобразование часовых поясов

Чтобы преобразовать значение из локальной зоны в зону UTC следует воспользоваться методом UTC(). Формат метода:

(time.Time).UTC() time.Time

Пример:

t := time.Date(2022, 3, 21, 22, 49, 47, 0, time.Local)
fmt.Println(t.String())       // 2022-03-21 22:49:47 +0300 MSK
t2 := t.UTC()
fmt.Println(t2.String())      // 2022-03-21 19:49:47 +0000 UTC

Для перевода значения зоны UTC в локальную зону предназначен метод Local(). Формат метода:

(time.Time).Local() time.Time

Пример:

t := time.Date(2022, 3, 21, 22, 49, 47, 0, time.UTC)
fmt.Println(t.String())       // 2022-03-21 22:49:47 +0000 UTC
t2 := t.Local()
fmt.Println(t2.String())      // 2022-03-22 01:49:47 +0300 MSK

Для преобразования произвольных часовых поясов можно использовать метод In(). Формат метода:

(time.Time).In(loc *time.Location) time.Time

Пример:

t := time.Date(2022, 3, 21, 22, 49, 47, 0, time.UTC)
fmt.Println(t.String())       // 2022-03-21 22:49:47 +0000 UTC
t2 := t.In(time.Local)
fmt.Println(t2.String())      // 2022-03-22 01:49:47 +0300 MSK

Учебник Go (Golang)
Учебник Go (Golang) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов

cpp