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 к неизменяемым операциям.

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, представляющий разницу между двумя моментами времени. Это задание демонстрирует, как построить полную временную шкалу проекта, используя арифметические операции со временем.

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

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Проверьте себя

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

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