Форматирование времени
Часть раздела Логика и управление потоком путешествия по GO на Coddy — урок 60 из 68.
Как только у вас появится объект time.Time, вам часто потребуется преобразовывать его в читаемый строковый формат. Go использует уникальный подход к форматированию времени, который отличается от других языков программирования.
Вместо использования кодов форматирования, таких как %Y-%m-%d, Go использует эталонную дату в качестве шаблона. Эта эталонная дата — Mon Jan 2 15:04:05 MST 2006, которая представляет собой точный момент: 2 января 2006 года, в 15:04:05 по горному стандартному времени (MST).
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 на основе макетов, предлагая вам применить несколько различных шаблонов форматов к одному и тому же объекту времени.
Шпаргалка
Go использует уникальный подход эталонной даты для форматирования времени: Mon Jan 2 15:04:05 MST 2006
Для форматирования объекта time.Time используйте метод Format с шаблонами разметки, основанными на эталонной дате:
now := time.Now()
formatted := now.Format("2006-01-02")
fmt.Println(formatted) // Output: 2023-10-26Распространенные шаблоны разметки:
"2006-01-02"— формат ISO (ГГГГ-ММ-ДД)"01/02/2006"— американский формат (ММ/ДД/ГГГГ)"02/01/2006"— европейский формат (ДД/ММ/ГГГГ)"January 2, 2006"— длинный формат"3:04 PM"— 12-часовой формат времени"15:04"— 24-часовой формат времени"Monday, January 2, 2006 at 3:04 PM"— полный формат"20060102"— компактный формат
Главное — расположить компоненты эталонной даты в нужном вам порядке.
Попробуйте сами
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Сравнение картИтоги: счетчик частоты слов3Интерфейсы (Основы)
Что такое интерфейс?Определение интерфейсаРеализация интерфейсаИспользование интерфейсных типовПустой интерфейсУтверждение типаПереключатель типовИтоги: Фигуры и поведение