Создание конкретного времени
Часть раздела Логика и управление потоком путешествия по GO на Coddy — урок 59 из 68.
Хотя time.Now() дает вам текущий момент, вам часто потребуется работать с конкретными датами и временем. Go предоставляет функцию time.Date для создания объекта time.Time, представляющего любую указанную вами дату и время.
Функция time.Date принимает семь параметров в строго определенном порядке: год, месяц, день, час, минута, секунда, наносекунда и местоположение (location). Вот базовый синтаксис:
birthday := time.Date(1990, time.March, 15, 14, 30, 0, 0, time.UTC)Обратите внимание, что Go использует такие константы, как time.March для месяцев, что делает ваш код более читаемым, чем использование чисел. Вы также можете использовать целые числа (1-12), если предпочитаете. Параметр местоположения обычно использует time.UTC для времени UTC или time.Local для локального часового пояса вашей системы.
Этот подход дает вам полный контроль над созданием любого конкретного момента времени, будь то день рождения, крайний срок или историческая дата. Результирующий объект time.Time работает точно так же, как и объект, полученный из time.Now(), и может использоваться со всеми теми же операциями со временем.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Задание
ЛегкоСоздайте приложение для построения временной шкалы исторических событий, которое использует time.Date для представления конкретных дат и времени из истории. Эта задача проверит ваше умение создавать объекты time.Time для точных исторических моментов и отображать их в организованном формате.
Вы получите два входных значения:
- Строку, содержащую исторические события в формате
"event1:year:month:day:hour:minute,event2:year:month:day:hour:minute"(например,"Moon Landing:1969:7:20:20:17,Berlin Wall Fall:1989:11:9:21:0") - Строку, содержащую параметры отображения, разделенные запятыми, в формате
"option1,option2,option3"(например,"chronological,details,summary")
Ваша задача:
- Разобрать первый входной параметр, разделив его по запятым, чтобы получить записи об отдельных событиях
- Для каждой записи о событии разделить ее по двоеточиям, чтобы извлечь название события, год, месяц, день, час и минуту
- Преобразовать числовые строки в целые числа и создать объект
time.Timeс помощьюtime.Dateдля каждого события (используйтеtime.UTCдля параметра местоположения и 0 для секунд и наносекунд) - Вывести заголовок приложения:
"=== HISTORICAL TIMELINE APPLICATION ===" - Вывести подтверждение загрузки событий:
"Loading historical events..." - Для каждого события вывести:
"Loaded: [event_name] - [complete_time_object]" - Разобрать второй входной параметр, разделив его по запятым, чтобы получить параметры отображения
- Обработать каждый параметр отображения:
- Для
"chronological": Вывести"=== CHRONOLOGICAL ORDER ===", а затем события, отсортированные по дате (сначала самые ранние), в формате"[event_name]: [year]-[month]-[day] at [hour]:[minute] UTC" - Для
"details": Вывести"=== DETAILED INFORMATION ===", а затем для каждого события показать:"Event: [event_name]"" Date: [year]-[month]-[day]"" Time: [hour]:[minute] UTC"" Weekday: [weekday_name]"" Unix timestamp: [unix_seconds]"
- Для
"summary": Вывести"=== TIMELINE SUMMARY ===", а затем:"Total events: [number_of_events]""Earliest event: [earliest_event_name] ([year])""Latest event: [latest_event_name] ([year])""Time span: [years_between_earliest_and_latest] years"
- Для
"years": Вывести"=== EVENTS BY DECADE ===", а затем события, сгруппированные по десятилетиям, в формате"[decade]s: [comma_separated_event_names]" - Вывести сообщение о завершении:
"Historical timeline processing completed"
Используйте пакет time для создания конкретных дат с помощью time.Date, пакет strings для разделения входных строк, пакет strconv для преобразования строковых чисел в целые числа и пакет fmt для форматированного вывода. Помните, что time.Date принимает параметры в строгом порядке: год, месяц, день, час, минута, секунда, наносекунда, местоположение. Для хронологической сортировки вы можете сравнивать объекты time.Time с помощью метода Before(). Эта задача демонстрирует, как создавать конкретные моменты времени и работать с историческими данными, используя функциональность времени в Go.
Шпаргалка
Используйте time.Date для создания объекта time.Time для конкретной даты и времени:
birthday := time.Date(1990, time.March, 15, 14, 30, 0, 0, time.UTC)Функция time.Date принимает восемь параметров в строгом порядке:
- год (int)
- месяц (time.Month или int 1-12)
- день (int)
- час (int)
- минута (int)
- секунда (int)
- наносекунда (int)
- местоположение (*time.Location)
Используйте константы месяцев, такие как time.March, для лучшей читаемости или целые числа (1-12). Распространенными местоположениями являются time.UTC и time.Local.
Попробуйте сами
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
"time"
)
func main() {
// Чтение ввода с использованием bufio.Scanner для правильной обработки пробелов
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
eventsInput := scanner.Text()
scanner.Scan()
optionsInput := scanner.Text()
// Разбор событий из входных данных
eventEntries := strings.Split(eventsInput, ",")
// Разбор параметров отображения из входных данных
displayOptions := strings.Split(optionsInput, ",")
// TODO: Напишите свой код ниже
// 1. Разберите каждую запись события, чтобы извлечь название, год, месяц, день, час, минуту
// 2. Не забудьте проверить, достаточно ли элементов в срезе частей перед доступом
// 3. Преобразуйте строковые числа в целые числа с помощью strconv.Atoi()
// 4. Создайте объекты time.Time с помощью time.Date() для каждого события
// 5. Отобразите заголовок приложения и сообщения о загрузке
// 6. Обработайте каждый параметр отображения (chronological, details, summary, years)
// 7. Отобразите сообщение о завершении
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Продвинутое управление потоком выполнения
Switch с использованием `fallthrough`Выход из вложенных цикловПродолжение конкретного циклаОператор `goto`Итоги: Продвинутое управление циклами4Проект: Простой список задач
Настройка проектаДобавление задачи7Углубленная обработка ошибок
Пользовательские типы ошибокОбертывание ошибок с помощью `%w`Распаковка с помощью `errors.Is`Распаковка с помощью `errors.As`Понимание `panic`Использование `recover`Итоги: Безопасное деление10Работа со временем
Получение текущего времениСоздание конкретного времениФорматирование времениПарсинг строк времениДлительность времениАрифметика времениОжидание и тикерыИтоги — Простой таймер2Структуры и методы
Определение методов для структурПолучатели по значениюПолучатели по указателюВыбор типа получателяМетоды против функцийИтоги: поведение структур5Карты: подробный разбор
Карты структурУказатели как значения картПроверка карт на nilСравнение картИтоги: счетчик частоты слов3Интерфейсы (Основы)
Что такое интерфейс?Определение интерфейсаРеализация интерфейсаИспользование интерфейсных типовПустой интерфейсУтверждение типаПереключатель типовИтоги: Фигуры и поведение