Арифметика времени
Часть раздела Логика и управление потоком путешествия по 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, представляющий разницу между двумя моментами времени. Это задание демонстрирует, как построить полную временную шкалу проекта, используя арифметические операции со временем.
Шпаргалка
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: Напишите свой код ниже
// - Обработайте каждую запись задачи, чтобы извлечь название, значение длительности и единицу измерения
// - Создайте объекты длительности для каждой задачи
// - Рассчитайте время начала и окончания задач
// - Найдите самую длинную и самую короткую задачи
// - Рассчитайте статистику проекта
// - Выведите все необходимые разделы выходных данных
// Вывод будет сгенерирован вашей реализацией выше
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Продвинутое управление потоком выполнения
Switch с использованием `fallthrough`Выход из вложенных цикловПродолжение конкретного циклаОператор `goto`Итоги: Продвинутое управление циклами4Проект: Простой список задач
Настройка проектаДобавление задачи2Структуры и методы
Определение методов для структурПолучатели по значениюПолучатели по указателюВыбор типа получателяМетоды против функцийИтоги: поведение структур5Карты: подробный разбор
Карты структурУказатели как значения картПроверка карт на nilСравнение картИтоги: счетчик частоты слов3Интерфейсы (Основы)
Что такое интерфейс?Определение интерфейсаРеализация интерфейсаИспользование интерфейсных типовПустой интерфейсУтверждение типаПереключатель типовИтоги: Фигуры и поведение