Создание заданного времени
Часть раздела Логика и управление потоком путешествия по GO на Coddy. Урок 59 из 68.
Хотя time.Now() возвращает текущий момент времени, часто вам понадобится работать с конкретными датами и временем. В Go есть функция time.Date для создания объекта time.Time, представляющего любые указанные вами дату и время.
Функция time.Date принимает восемь параметров именно в таком порядке: год, месяц, день, час, минута, секунда, наносекунда и местоположение. Вот базовый синтаксис:
birthday := time.Date(1990, time.March, 15, 14, 30, 0, 0, time.UTC)Обрати внимание, что в Go для обозначения месяцев используются константы, например time.March, благодаря чему код становится более читаемым, чем при использовании чисел. При желании можно также использовать целые числа (1-12). В качестве параметра местоположения обычно указывают time.UTC для времени UTC или time.Local для местного часового пояса системы.
Этот подход дает тебе полный контроль над созданием любого конкретного момента времени — будь то день рождения, крайний срок или историческая дата. Полученный объект time.Time работает точно так же, как объект из time.Now(), и его можно использовать со всеми теми же операциями со временем.
Задание
ЛегкоСоздайте приложение для отображения хронологии исторических событий, которое использует time.Date для представления конкретных исторических дат и времени. Это задание проверит вашу способность создавать объекты time.Time для точных исторических моментов и отображать их в упорядоченном виде.
Вы получите два входных значения:
- Строку с историческими событиями в формате
"event1:year:month:day:hour:minute,event2:year:month:day:hour:minute"(например,"Moon Landing:1969:7:20:20:17,Berlin Wall Fall:1989:11:9:21:0") - Строку с параметрами отображения, разделёнными запятыми, в формате
"option1,option2,option3"(например,"chronological,details,summary")
Ваша задача:
- Разобрать первую строку, разделив её по запятым, чтобы получить отдельные записи о событиях
- Для каждой записи о событии разделить её по двоеточиям, чтобы извлечь название события, год, месяц, день, час и минуту
- Преобразовать числовые строки в целые числа и создать объект
time.Timeс помощьюtime.Dateдля каждого события (используйтеtime.UTCв качестве параметра местоположения, а для секунд и наносекунд укажите 0) - Отобразить заголовок приложения:
"=== HISTORICAL TIMELINE APPLICATION ===" - Отобразить подтверждение загрузки событий:
"Loading historical events..." - Для каждого события отобразить:
"Loaded: [event_name] - [complete_time_object]" - Разобрать вторую строку, разделив её по запятым, чтобы получить параметры отображения
- Обработать каждый параметр отображения:
- Для
"chronological": отобразить"=== CHRONOLOGICAL ORDER ===", а затем события, отсортированные по дате (сначала самые ранние), в формате"[event_name]: [year]-[month]-[day] at [hour]:[minute] UTC" - Для
"details": отобразить"=== DETAILED INFORMATION ===", а затем следующие строки для каждого события (последние четыре строки должны иметь отступ в два пробела):Event: [event_name] Date: [year]-[month]-[day] Time: [hour]:[minute] UTC Weekday: [weekday_name] Unix timestamp: [unix_seconds] - Для
"summary": отобразить"=== TIMELINE SUMMARY ===", а затем:"Total events: [number_of_events]""Earliest event: [earliest_event_name] ([year])""Latest event: [latest_event_name] ([year])""Time span: [years_between_earliest_and_latest] years"
- Для
"years": отобразить"=== EVENTS BY DECADE ===", а затем события, сгруппированные по десятилетиям, в формате"[decade]s: [comma_separated_event_names]" - Отобразить сообщение о завершении:
"Historical timeline processing completed"
Правила форматирования: в строке Loaded: значение time.Time выводится как есть с помощью %v, например Loaded: Moon Landing - 1969-07-20 20:17:00 +0000 UTC. Все остальные даты и время формируются вручную: месяц, день и час выводятся без ведущего нуля, а минута всегда состоит из двух цифр (%02d), поэтому то же событие выводится как Moon Landing: 1969-7-20 at 20:17 UTC, а минута 0 — как 21:00. [unix_seconds] — это результат вызова Unix(); для дат до 1970 года он отрицательный. В списке десятилетий они располагаются от самых ранних к самым поздним, а названия событий внутри каждого десятилетия соединяются запятой без пробела и идут в порядке ввода.
Используйте пакет time, чтобы создавать конкретные даты с помощью time.Date, пакет strings — чтобы разделять входные строки, пакет strconv — чтобы преобразовывать числовые строки в целые числа, а пакет fmt — для форматированного вывода. Помните, что time.Date принимает параметры строго в следующем порядке: год, месяц, день, час, минута, секунда, наносекунда, местоположение. Для хронологической сортировки можно сравнивать объекты time.Time с помощью метода Before(). Это задание показывает, как создавать конкретные моменты времени и работать с историческими данными, используя возможности Go для работы со временем.
Попробуйте сами
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
"time"
)
func main() {
// Считайте ввод с помощью bufio.Scanner, чтобы корректно обрабатывать пробелы
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
eventsInput := scanner.Text()
scanner.Scan()
optionsInput := scanner.Text()
// Разберите события из ввода
eventEntries := strings.Split(eventsInput, ",")
// Разберите параметры отображения из ввода
displayOptions := strings.Split(optionsInput, ",")
// TODO: Напишите свой код ниже
// 1. Разберите каждую запись о событии, чтобы извлечь название, год, месяц, день, час и минуту
// 2. Перед обращением к элементам проверьте, достаточно ли их в срезе parts
// 3. Преобразуйте строковые представления чисел в целые числа с помощью strconv.Atoi()
// 4. Создайте объекты time.Time с помощью time.Date() для каждого события
// 5. Выведите заголовок приложения и сообщения о загрузке
// 6. Обработайте каждый параметр отображения (chronological, details, summary, years)
// 7. Выведите сообщение о завершении
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Продвинутое управление потоком
Оператор switch с `fallthrough`Выход из вложенных цикловПереход к следующей итерации конкретного циклаОператор `goto`Повторение: расширенное управление циклами4Проект: простой список задач
Настройка проектаДобавление задачи7Обработка ошибок: углублённый разбор
Пользовательские типы ошибокОбёртывание ошибок с помощью `%w`Извлечение исходной ошибки с помощью `errors.Is`Извлечение исходной ошибки с помощью `errors.As`Разбираемся с `panic`Использование `recover`Итоги — безопасное деление10Работа со временем
Получение текущего времениСоздание заданного времениФорматирование времениРазбор строк времениПродолжительность времениАрифметика времениОжидание и тикерыПовторение — простой таймер2Структуры и методы
Определение методов для структурПолучатели-значенияПолучатели-указателиВыбор получателейМетоды и функцииПовторение: поведение структур5Карты: подробный разбор
Карты структурУказатели как значения картПроверка карт на nilСравнение картПовторение — счётчик частоты слов8Проект: простой складской учёт
Обзор проектаПроверка запасов3Интерфейсы (основы)
Что такое интерфейс?Определение интерфейсаРеализация интерфейсаИспользование типов интерфейсовПустой интерфейсУтверждения типовПереключатель типовПовторение — формы и поведениеПотренируйтесь самостоятельно: Онлайн-компилятор Go