Menu
Coddy logo textTech

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

Часть раздела Логика и управление потоком путешествия по GO на Coddy — урок 59 из 68.

В то время как time.Now() возвращает текущий момент, вам часто потребуется работать с конкретными датами и временем. Go предоставляет функцию time.Date для создания объекта time.Time, представляющего любую указанную вами дату и время.

Функция time.Date принимает восемь параметров в строго определенном порядке: год, месяц, день, час, минута, секунда, наносекунда и местоположение (location). Вот базовый синтаксис:

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"

Используйте пакет 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. Разберите каждую запись события, чтобы извлечь name, year, month, day, hour, minute
	// 2. Не забудьте проверить, достаточно ли элементов в срезе parts перед обращением к ним
	// 3. Преобразуйте строковые числа в целые с помощью strconv.Atoi()
	// 4. Создайте объекты time.Time, используя time.Date() для каждого события
	// 5. Выведите заголовок приложения и сообщения о загрузке
	// 6. Обработайте каждую опцию отображения (chronological, details, summary, years)
	// 7. Выведите сообщение о завершении
	
}
quiz iconПроверьте себя

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

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