Форматирование времени
Часть раздела Логика и управление потоком путешествия по GO на Coddy. Урок 60 из 68.
Получив объект time.Time, вам часто потребуется преобразовать его в удобочитаемую строку. В Go используется уникальный подход к форматированию времени, отличающийся от подходов в других языках программирования.
Вместо использования кодов формата, таких как %Y-%m-%d, в Go используется эталонная дата в качестве шаблона. Эта эталонная дата — Mon Jan 2 15:04:05 MST 2006, которая обозначает точный момент времени: 2 января 2006 года, 15:04:05 по горному стандартному времени.
now := time.Now()
formatted := now.Format("2006-01-02")
fmt.Println(formatted) // Вывод: 2023-10-26Главная идея состоит в том, чтобы расположить компоненты эталонной даты в нужном вам порядке. Для формата YYYY-MM-DD используется "2006-01-02", потому что именно так выглядит эталонная дата в этом формате. Для другого формата, например Jan 2, 2006, используется "Jan 2, 2006".
Этот подход к форматированию на основе шаблона делает форматирование времени в Go одновременно запоминающимся и гибким. Запомнив эталонную дату, ты сможешь создать любой формат, просто расположив её компоненты в нужном тебе порядке.
Задание
ЛегкоСоздай систему отображения даты и времени в нескольких форматах, которая форматирует объекты time.Time с помощью уникальной системы шаблонов на основе эталонной даты в Go. Это задание проверит твоё умение использовать метод Format с разными шаблонами формата для создания различных представлений даты и времени.
Тебе будут предоставлены два входных значения:
- Строка с информацией о дате в формате
"year:month:day:hour:minute"(например,"2023:12:25:14:30") - Строка с запросами формата, разделёнными запятыми, в формате
"format1,format2,format3"(например,"iso,american,european,time12,time24")
Твоя задача:
- Разобрать первое входное значение, разделив его по двоеточиям, чтобы извлечь значения года, месяца, дня, часа и минуты
- Преобразовать эти строковые значения в целые числа с помощью пакета
strconv - Создать объект
time.Timeс помощьюtime.Dateи разобранных значений (используйtime.UTCдля часового пояса, а для секунд и наносекунд — 0) - Вывести заголовок приложения:
"=== DATE/TIME FORMATTER ===" - Вывести исходное время:
"Source time: [complete_time_object]" - Разобрать второе входное значение, разделив его по запятым, чтобы получить запросы формата
- Вывести заголовок форматирования:
"Formatted outputs:" - Для каждого запроса формата использовать соответствующую строку шаблона вместе с методом
Format:- Для
"iso": использовать шаблон"2006-01-02"и вывести"ISO format: [formatted_result]" - Для
"american": использовать шаблон"01/02/2006"и вывести"American format: [formatted_result]" - Для
"european": использовать шаблон"02/01/2006"и вывести"European format: [formatted_result]" - Для
"long": использовать шаблон"January 2, 2006"и вывести"Long format: [formatted_result]" - Для
"time12": использовать шаблон"3:04 PM"и вывести"12-hour time: [formatted_result]" - Для
"time24": использовать шаблон"15:04"и вывести"24-hour time: [formatted_result]" - Для
"full": использовать шаблон"Monday, January 2, 2006 at 3:04 PM"и вывести"Full format: [formatted_result]" - Для
"compact": использовать шаблон"20060102"и вывести"Compact format: [formatted_result]"
- Для
- Вычислить и вывести статистику:
"=== FORMATTING SUMMARY ===""Total formats applied: [number_of_format_requests]""Date components: [year]-[month]-[day]""Time components: [hour]:[minute]"
- Вывести справочную информацию:
"=== REFERENCE DATE INFO ===""Go uses reference date: Mon Jan 2 15:04:05 MST 2006""This represents: January 2nd, 2006 at 3:04:05 PM""Layout patterns arrange these components as needed"
- Вывести сообщение о завершении:
"Date formatting completed using Go's layout system"
Используй пакет time для операций со временем, пакет strings для разделения входных строк, пакет strconv для преобразования строк в целые числа и пакет fmt для форматированного вывода. Помни, что для форматирования времени в Go используется эталонная дата Mon Jan 2 15:04:05 MST 2006 в качестве шаблона, а компоненты этой даты располагаются в нужном тебе порядке. Это задание показывает, как работает уникальная система форматирования Go на основе шаблонов: тебе предстоит применить несколько разных шаблонов формата к одному и тому же объекту времени.
Попробуйте сами
package main
import (
"fmt"
"strconv"
"strings"
"time"
)
func main() {
// Считать входные данные
var dateInput string
var formatInput string
fmt.Scanln(&dateInput)
fmt.Scanln(&formatInput)
// Разобрать компоненты даты, разделив строку по двоеточиям
dateComponents := strings.Split(dateInput, ":")
// Преобразовать строковые компоненты в целые числа
year, _ := strconv.Atoi(dateComponents[0])
month, _ := strconv.Atoi(dateComponents[1])
day, _ := strconv.Atoi(dateComponents[2])
hour, _ := strconv.Atoi(dateComponents[3])
minute, _ := strconv.Atoi(dateComponents[4])
// Создать объект time.Time
sourceTime := time.Date(year, time.Month(month), day, hour, minute, 0, 0, time.UTC)
// Разобрать запросы на форматирование
formatRequests := strings.Split(formatInput, ",")
// TODO: Напишите свой код ниже
// Вывести заголовок приложения
// Вывести исходное время
// Обработать каждый запрос на форматирование и вывести результаты
// Рассчитать и вывести статистику
// Вывести справочную информацию
// Вывести сообщение о завершении
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Продвинутое управление потоком
Оператор switch с `fallthrough`Выход из вложенных цикловПереход к следующей итерации конкретного циклаОператор `goto`Повторение: расширенное управление циклами4Проект: простой список задач
Настройка проектаДобавление задачи7Обработка ошибок: углублённый разбор
Пользовательские типы ошибокОбёртывание ошибок с помощью `%w`Извлечение исходной ошибки с помощью `errors.Is`Извлечение исходной ошибки с помощью `errors.As`Разбираемся с `panic`Использование `recover`Итоги — безопасное деление10Работа со временем
Получение текущего времениСоздание заданного времениФорматирование времениРазбор строк времениПродолжительность времениАрифметика времениОжидание и тикерыПовторение — простой таймер2Структуры и методы
Определение методов для структурПолучатели-значенияПолучатели-указателиВыбор получателейМетоды и функцииПовторение: поведение структур5Карты: подробный разбор
Карты структурУказатели как значения картПроверка карт на nilСравнение картПовторение — счётчик частоты слов8Проект: простой складской учёт
Обзор проектаПроверка запасов3Интерфейсы (основы)
Что такое интерфейс?Определение интерфейсаРеализация интерфейсаИспользование типов интерфейсовПустой интерфейсУтверждения типовПереключатель типовПовторение — формы и поведениеПотренируйтесь самостоятельно: Онлайн-компилятор Go