Menu
CoddyTech

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

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

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 на основе шаблонов: тебе предстоит применить несколько разных шаблонов формата к одному и тому же объекту времени.

Попробуйте сами

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Проверьте себя

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

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

Потренируйтесь самостоятельно: Онлайн-компилятор Go