Создание конкретного времени
Часть раздела Логика и управление потоком путешествия по GO на Coddy. Урок 59 из 68.
Хотя time.Now() возвращает текущий момент, вам часто потребуется работать с конкретными датами и временем. Go предоставляет функцию time.Date для создания объекта time.Time, представляющего любые указанные вами дату и время.
Функция time.Date принимает восемь параметров в следующем точном порядке: год, месяц, day, час, минута, секунда, наносекунда и часовой пояс. Вот базовый синтаксис:
birthday := time.Date(1990, time.March, 15, 14, 30, 0, 0, time.UTC)Обратите внимание, что Go использует такие константы, как time.March, для обозначения месяцев, благодаря чему ваш код становится более понятным, чем при использовании чисел. При желании вы также можете использовать целые числа (1–12). В параметре location обычно указывают time.UTC для времени UTC или time.Local для местного часового пояса вашей системы.
Этот подход даёт вам полный контроль над созданием любого конкретного момента времени — будь то birthday, крайний срок или historical дата. Полученный объект time.Time работает точно так же, как объект из time.Now(), и может использоваться со всеми теми же операциями над временем.
Задание
ЛегкоСоздайте приложение временной шкалы исторических событий, использующее time.Date для представления конкретных дат и времени из истории. Это задание проверит вашу способность создавать объекты time.Time для точных исторических моментов и отображать их в организованном формате.
Вы получите два входных значения:
- Строку, содержащую исторические event в формате
"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")
Ваша задача:
- Разберите первый входной параметр, разделив его по запятым, чтобы получить отдельные записи event
- Для каждой записи event разделите её по двоеточиям, чтобы извлечь имя event, year, month, day, hour и minute
- Преобразуйте числовые строки в целые числа и создайте объект
time.Timeс помощьюtime.Dateдля каждого event (используйтеtime.UTCдля параметра расположения и 0 для секунд и наносекунд) - Выведите заголовок приложения:
"=== HISTORICAL TIMELINE APPLICATION ===" - Выведите подтверждение загрузки event:
"Loading historical events..." - Для каждого event выведите:
"Loaded: [event_name] - [complete_time_object]" - Разберите второй входной параметр, разделив его по запятым, чтобы получить параметры отображения
- Обработайте каждый параметр отображения:
- Для
"chronological": выведите"=== CHRONOLOGICAL ORDER ===", а затем event, отсортированные по дате (сначала самые ранние), в формате"[event_name]: [year]-[month]-[day] at [hour]:[minute] UTC" - Для
"details": выведите"=== DETAILED INFORMATION ===", а затем каждый event в следующем формате:"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 ===", а затем event, сгруппированные по десятилетиям, в формате"[decade]s: [comma_separated_event_names]" - Выведите сообщение о завершении:
"Historical timeline processing completed"
Используйте пакет time для создания конкретных дат с помощью time.Date, пакет strings для разделения входных строк, пакет strconv для преобразования строковых чисел в целые числа и пакет fmt для форматированного вывода. Помните, что time.Date принимает параметры в точном порядке: year, month, day, hour, minute, second, nanosecond, location. Для хронологической сортировки можно сравнивать объекты 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. Разобрать каждую запись события, чтобы извлечь name, year, month, day, hour, minute
// 2. Не забудьте проверить, что срез parts содержит достаточно элементов перед доступом
// 3. Преобразовать строковые числа в целые с помощью strconv.Atoi()
// 4. Создать объекты time.Time с помощью time.Date() для каждого события
// 5. Отобразить заголовок приложения и сообщения о загрузке
// 6. Process each display option (chronological, details, summary, years)
// 7. Отобразить сообщение о завершении
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Продвинутое управление потоком выполнения
Switch с использованием `fallthrough`Выход из вложенных цикловПродолжение конкретного циклаОператор `goto`Итоги: Продвинутое управление циклами4Проект: Простой список задач
Настройка проектаДобавление задачи7Углубленная обработка ошибок
Пользовательские типы ошибокОбертывание ошибок с помощью `%w`Распаковка с помощью `errors.Is`Распаковка с помощью `errors.As`Понимание `panic`Использование `recover`Итоги: Безопасное деление10Работа со временем
Получение текущего времениСоздание конкретного времениФорматирование времениПарсинг строк времениДлительность времениАрифметика времениОжидание и тикерыИтоги — Простой таймер2Структуры и методы
Определение методов для структурПолучатели по значениюПолучатели по указателюВыбор типа получателяМетоды против функцийИтоги: поведение структур5Карты: подробный разбор
Карты структурУказатели как значения картПроверка карт на nilСравнение картИтоги: счетчик частоты слов3Интерфейсы (Основы)
Что такое интерфейс?Определение интерфейсаРеализация интерфейсаИспользование интерфейсных типовПустой интерфейсУтверждение типаПереключатель типовИтоги: Фигуры и поведениеПотренируйтесь самостоятельно: Онлайн-компилятор Go