Menu
Coddy logo textTech

Арифметика времени

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

Теперь, когда вы понимаете объекты time.Time и значения time.Duration, вы можете выполнять арифметические операции для вычисления прошедшего или будущего времени. Go предоставляет два основных метода для арифметики времени: Add и Sub.

Метод Add принимает time.Duration и возвращает новый time.Time, который представляет исходное время плюс указанный интервал:

now := time.Now()
tomorrow := now.Add(24 * time.Hour)
fmt.Println(tomorrow)

Метод Sub работает двумя способами. Когда вы вычитаете одно значение time.Time из другого, он возвращает time.Duration, представляющий разницу между ними:

start := time.Now()
end := start.Add(2 * time.Hour)
difference := end.Sub(start) // Возвращает 2h0m0s

Эти методы позволяют легко вычислять крайние сроки, измерять прошедшее время или планировать будущие события. Исходный объект time.Time остается неизменным — оба метода возвращают новые значения, следуя предпочтению Go к неизменяемым операциям.

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

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

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

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

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

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

challenge icon

Задание

Легко

Создайте калькулятор дедлайнов проекта, который использует арифметику времени для определения этапов и сроков проекта. Это задание проверит ваше умение использовать методы Add и Sub объектов time.Time для вычисления будущих дат и разницы во времени между событиями.

Вы получите два входных значения:

  • Строка, содержащая информацию о начале проекта в формате "year:month:day:hour:minute" (например, "2024:1:15:9:0")
  • Строка, содержащая длительность задач в формате "task1:duration_value:duration_unit,task2:duration_value:duration_unit" (например, "Planning:5:Day,Development:3:Week,Testing:10:Day")

Ваша задача:

  1. Разобрать первый входной параметр, разделив его по двоеточиям, чтобы извлечь значения года, месяца, дня, часа и минут
  2. Преобразовать эти строковые значения в целые числа и создать время начала проекта с помощью time.Date (используйте time.UTC для местоположения, 0 для секунд и наносекунд)
  3. Разобрать второй входной параметр, разделив его по запятым, чтобы получить записи об отдельных задачах
  4. Для каждой записи задачи разделить ее по двоеточиям, чтобы извлечь название задачи, значение длительности и единицу измерения длительности
  5. Преобразовать значения длительности в целые числа и создать объекты time.Duration, используя соответствующие константы:
    • Для "Day": умножить на 24 * time.Hour
    • Для "Week": умножить на 7 * 24 * time.Hour
    • Для "Hour": умножить на time.Hour
  6. Вывести заголовок приложения: "=== PROJECT DEADLINE CALCULATOR ==="
  7. Вывести начало проекта: "Project start time: [start_time_object]"
  8. Рассчитать дедлайны задач, прибавляя длительность каждой задачи к времени окончания предыдущей задачи (первая задача начинается во время начала проекта):
  9. Для каждой задачи вывести:
    • "Task: [task_name]"
    • " Duration: [duration_object]"
    • " Start: [task_start_time]"
    • " End: [task_end_time]" (рассчитано с помощью метода Add)
  10. Рассчитать и вывести временную шкалу проекта:
    • "=== PROJECT TIMELINE ==="
    • "Project start: [start_time_object]"
    • "Project end: [final_task_end_time]"
    • "Total project duration: [total_duration_object]" (рассчитано с помощью метода Sub между окончанием и началом проекта)
  11. Вывести анализ задач:
    • "=== TASK ANALYSIS ==="
    • "Number of tasks: [number_of_tasks]"
    • "Longest task: [longest_task_name] ([longest_duration_object])"
    • "Shortest task: [shortest_task_name] ([shortest_duration_object])"
  12. Рассчитать время между последовательными задачами и вывести промежутки:
    • "=== TASK TRANSITIONS ==="
    • Для каждой пары последовательных задач: "[first_task_name] to [second_task_name]: [time_difference_object]" (должно быть 0, так как задачи идут подряд)
  13. Вывести статистику проекта:
    • "=== PROJECT STATISTICS ==="
    • "Total working days: [total_duration_in_hours_divided_by_24]"
    • "Total working hours: [total_duration_in_hours]"
    • "Project spans [number_of_calendar_days] calendar days"
  14. Вывести сообщение о завершении: "Project timeline calculation completed successfully"

Используйте пакет time для операций со временем, пакет strings для разделения входных строк, пакет strconv для преобразования строк в целые числа и пакет fmt для форматированного вывода. Помните, что метод Add возвращает новый объект time.Time, представляющий исходное время плюс длительность, а метод Sub возвращает time.Duration, представляющий разницу между двумя моментами времени. Это задание демонстрирует, как построить полную временную шкалу проекта, используя арифметические операции со временем.

Шпаргалка

Go предоставляет два основных метода для арифметики времени: Add и Sub.

Метод Add принимает time.Duration и возвращает новый time.Time:

now := time.Now()
tomorrow := now.Add(24 * time.Hour)

Метод Sub вычитает один time.Time из другого и возвращает time.Duration:

start := time.Now()
end := start.Add(2 * time.Hour)
difference := end.Sub(start) // Возвращает 2h0m0s

Оба метода возвращают новые значения, не изменяя исходный объект time.Time.

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

package main

import (
	"fmt"
	"strconv"
	"strings"
	"time"
)

func main() {
	// Чтение входных данных
	var startInfo string
	var taskInfo string
	fmt.Scanln(&startInfo)
	fmt.Scanln(&taskInfo)
	
	// Разбор информации о времени начала
	startParts := strings.Split(startInfo, ":")
	year, _ := strconv.Atoi(startParts[0])
	month, _ := strconv.Atoi(startParts[1])
	day, _ := strconv.Atoi(startParts[2])
	hour, _ := strconv.Atoi(startParts[3])
	minute, _ := strconv.Atoi(startParts[4])
	
	// Создание времени начала проекта
	startTime := time.Date(year, time.Month(month), day, hour, minute, 0, 0, time.UTC)
	
	// Разбор информации о задачах
	taskEntries := strings.Split(taskInfo, ",")
	
	// TODO: Напишите свой код ниже
	// - Обработайте каждую запись задачи, чтобы извлечь название, значение длительности и единицу измерения
	// - Создайте объекты длительности для каждой задачи
	// - Рассчитайте время начала и окончания задач
	// - Найдите самую длинную и самую короткую задачи
	// - Рассчитайте статистику проекта
	// - Выведите все необходимые разделы выходных данных
	
	// Вывод будет сгенерирован вашей реализацией выше
}
quiz iconПроверьте себя

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

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