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