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

quiz iconПроверьте себя

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

quiz iconПроверьте себя

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

quiz iconПроверьте себя

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

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.

Шпаргалка

Используйте time.Date для создания объекта time.Time для конкретной даты и времени:

birthday := time.Date(1990, time.March, 15, 14, 30, 0, 0, time.UTC)

Функция time.Date принимает восемь параметров в строгом порядке:

  • год (int)
  • месяц (time.Month или int 1-12)
  • день (int)
  • час (int)
  • минута (int)
  • секунда (int)
  • наносекунда (int)
  • местоположение (*time.Location)

Используйте константы месяцев, такие как time.March, для лучшей читаемости или целые числа (1-12). Распространенными местоположениями являются time.UTC и time.Local.

Попробуйте сами

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

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

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