Menu
CoddyTech

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

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

challenge icon

Задание

Легко

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

Ваша задача:

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

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

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

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