Арифметика времени
Часть раздела Логика и управление потоком путешествия по 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 к неизменяемым операциям.
Задание
ЛегкоСоздайте калькулятор дедлайнов проекта, который использует арифметику времени для определения этапов и сроков проекта. Это задание проверит ваше умение использовать методы 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")
Ваша задача:
- Разобрать первый входной параметр, разделив его по двоеточиям, чтобы извлечь значения года, месяца, дня, часа и минут
- Преобразовать эти строковые значения в целые числа и создать время начала проекта с помощью
time.Date(используйтеtime.UTCдля местоположения, 0 для секунд и наносекунд) - Разобрать второй входной параметр, разделив его по запятым, чтобы получить записи об отдельных задачах
- Для каждой записи задачи разделить ее по двоеточиям, чтобы извлечь название задачи, значение длительности и единицу измерения длительности
- Преобразовать значения длительности в целые числа и создать объекты
time.Duration, используя соответствующие константы:- Для
"Day": умножить на24 * time.Hour - Для
"Week": умножить на7 * 24 * time.Hour - Для
"Hour": умножить наtime.Hour
- Для
- Вывести заголовок приложения:
"=== PROJECT DEADLINE CALCULATOR ===" - Вывести начало проекта:
"Project start time: [start_time_object]" - Рассчитать дедлайны задач, прибавляя длительность каждой задачи к времени окончания предыдущей задачи (первая задача начинается во время начала проекта):
- Для каждой задачи вывести:
"Task: [task_name]"" Duration: [duration_object]"" Start: [task_start_time]"" End: [task_end_time]"(рассчитано с помощью методаAdd)
- Рассчитать и вывести временную шкалу проекта:
"=== PROJECT TIMELINE ===""Project start: [start_time_object]""Project end: [final_task_end_time]""Total project duration: [total_duration_object]"(рассчитано с помощью методаSubмежду окончанием и началом проекта)
- Вывести анализ задач:
"=== TASK ANALYSIS ===""Number of tasks: [number_of_tasks]""Longest task: [longest_task_name] ([longest_duration_object])""Shortest task: [shortest_task_name] ([shortest_duration_object])"
- Рассчитать время между последовательными задачами и вывести промежутки:
"=== TASK TRANSITIONS ==="- Для каждой пары последовательных задач:
"[first_task_name] to [second_task_name]: [time_difference_object]"(должно быть 0, так как задачи идут подряд)
- Вывести статистику проекта:
"=== 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"
- Вывести сообщение о завершении:
"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: Напишите свой код ниже
// - Обработайте каждую запись задачи, чтобы извлечь название, значение длительности и единицу измерения
// - Создайте объекты длительности для каждой задачи
// - Рассчитайте время начала и окончания задач
// - Найдите самую длинную и самую короткую задачи
// - Рассчитайте статистику проекта
// - Выведите все необходимые разделы выходных данных
// Вывод будет сгенерирован вашей реализацией выше
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Продвинутое управление потоком выполнения
Switch с использованием `fallthrough`Выход из вложенных цикловПродолжение конкретного циклаОператор `goto`Итоги: Продвинутое управление циклами4Проект: Простой список задач
Настройка проектаДобавление задачи2Структуры и методы
Определение методов для структурПолучатели по значениюПолучатели по указателюВыбор типа получателяМетоды против функцийИтоги: поведение структур5Карты: подробный разбор
Карты структурУказатели как значения картПроверка карт на nilСравнение картИтоги: счетчик частоты слов3Интерфейсы (Основы)
Что такое интерфейс?Определение интерфейсаРеализация интерфейсаИспользование интерфейсных типовПустой интерфейсУтверждение типаПереключатель типовИтоги: Фигуры и поведение