Menu
Coddy logo textTech

Создание конкретного времени

Часть раздела Логика и управление потоком путешествия по 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(), и может использоваться со всеми теми же операциями над временем.

challenge icon

Задание

Легко

Создайте приложение временной шкалы исторических событий, использующее 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")

Ваша задача:

  1. Разберите первый входной параметр, разделив его по запятым, чтобы получить отдельные записи event
  2. Для каждой записи event разделите её по двоеточиям, чтобы извлечь имя event, year, month, day, hour и minute
  3. Преобразуйте числовые строки в целые числа и создайте объект time.Time с помощью time.Date для каждого event (используйте time.UTC для параметра расположения и 0 для секунд и наносекунд)
  4. Выведите заголовок приложения: "=== HISTORICAL TIMELINE APPLICATION ==="
  5. Выведите подтверждение загрузки event: "Loading historical events..."
  6. Для каждого event выведите: "Loaded: [event_name] - [complete_time_object]"
  7. Разберите второй входной параметр, разделив его по запятым, чтобы получить параметры отображения
  8. Обработайте каждый параметр отображения:
    • Для "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]"
  9. Выведите сообщение о завершении: "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. Отобразить сообщение о завершении
	
}
quiz iconПроверьте себя

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

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

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