Menu
Coddy logo textTech

Форматирование времени

Часть раздела Логика и управление потоком путешествия по 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 одновременно запоминающимся и гибким. Как только вы запомните эталонную дату, вы сможете создать любой формат, просто расположив его компоненты в нужном вам порядке.

quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

challenge icon

Задание

Легко

Создайте систему отображения даты и времени в нескольких форматах, которая форматирует объекты time.Time, используя уникальную систему макетов эталонной даты Go. Эта задача проверит ваше умение использовать метод Format с различными шаблонами макетов для создания разнообразных представлений даты и времени.

Вы получите два входных значения:

  • Строка, содержащая информацию о дате в формате "year:month:day:hour:minute" (например, "2023:12:25:14:30")
  • Строка, содержащая запросы форматов, разделенные запятыми, в формате "format1,format2,format3" (например, "iso,american,european,time12,time24")

Ваша задача:

  1. Разобрать первый входной параметр, разделив его по двоеточиям, чтобы извлечь значения года, месяца, дня, часа и минут
  2. Преобразовать эти строковые значения в целые числа с помощью пакета strconv
  3. Создать объект time.Time с помощью time.Date, используя полученные значения (используйте time.UTC для местоположения, 0 для секунд и наносекунд)
  4. Вывести заголовок приложения: "=== DATE/TIME FORMATTER ==="
  5. Вывести исходное время: "Source time: [complete_time_object]"
  6. Разобрать второй входной параметр, разделив его по запятым, чтобы получить запросы форматов
  7. Вывести заголовок форматирования: "Formatted outputs:"
  8. Для каждого запроса формата используйте соответствующую строку макета с методом 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]"
  9. Рассчитать и вывести статистику:
    • "=== FORMATTING SUMMARY ==="
    • "Total formats applied: [number_of_format_requests]"
    • "Date components: [year]-[month]-[day]"
    • "Time components: [hour]:[minute]"
  10. Вывести справочную информацию:
    • "=== 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"
  11. Вывести сообщение о завершении: "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: Напишите свой код ниже
	// Отображение заголовка приложения
	// Отображение исходного времени
	// Обработка каждого запроса формата и вывод отформатированных данных
	// Расчет и отображение статистики
	// Отображение справочной информации
	// Отображение сообщения о завершении
	
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком