Menu
CoddyTech

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

Часть раздела Логика и управление потоком путешествия по 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Проверьте себя

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

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

Потренируйтесь самостоятельно: Онлайн-компилятор Go