Criando um Horário Específico
Parte da seção Lógica & Fluxo do Journey de GO da Coddy — lição 59 de 68.
Enquanto time.Now() fornece o momento atual, você frequentemente precisará trabalhar com datas e horas específicas. O Go fornece a função time.Date para criar um objeto time.Time representando qualquer data e hora que você especificar.
A função time.Date recebe sete parâmetros nesta ordem exata: ano, mês, dia, hora, minuto, segundo, nanossegundo e localização. Aqui está a sintaxe básica:
birthday := time.Date(1990, time.March, 15, 14, 30, 0, 0, time.UTC)Observe que o Go usa constantes como time.March para meses, o que torna seu código mais legível do que usar números. Você também pode usar números inteiros (1-12) se preferir. O parâmetro de localização normalmente usa time.UTC para o horário UTC ou time.Local para o fuso horário local do seu sistema.
Esta abordagem oferece controle total sobre a criação de qualquer momento específico no tempo, seja um aniversário, um prazo ou uma data histórica. O objeto time.Time resultante funciona exatamente como aquele de time.Now() e pode ser usado com todas as mesmas operações de tempo.
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Desafio
FácilCrie um aplicativo de linha do tempo de eventos históricos que use time.Date para representar datas e horas específicas da história. Este desafio testará sua habilidade de criar objetos time.Time para momentos históricos precisos e exibi-los em um formato organizado.
Você receberá duas entradas:
- Uma string contendo eventos históricos no formato
"event1:year:month:day:hour:minute,event2:year:month:day:hour:minute"(ex:"Moon Landing:1969:7:20:20:17,Berlin Wall Fall:1989:11:9:21:0") - Uma string contendo opções de exibição separadas por vírgulas no formato
"option1,option2,option3"(ex:"chronological,details,summary")
Sua tarefa é:
- Analisar a primeira entrada dividindo-a por vírgulas para obter as entradas de eventos individuais
- Para cada entrada de evento, dividir por dois-pontos para extrair o nome do evento, ano, mês, dia, hora e minuto
- Converter as strings numéricas em inteiros e criar um objeto
time.Timeusandotime.Datepara cada evento (usetime.UTCpara o parâmetro de localização e 0 para segundos e nanossegundos) - Exibir o cabeçalho da aplicação:
"=== HISTORICAL TIMELINE APPLICATION ===" - Exibir a confirmação de carregamento dos eventos:
"Loading historical events..." - Para cada evento, exibir:
"Loaded: [event_name] - [complete_time_object]" - Analisar a segunda entrada dividindo-a por vírgulas para obter as opções de exibição
- Processar cada opção de exibição:
- Para
"chronological": Exibir"=== CHRONOLOGICAL ORDER ==="seguido pelos eventos ordenados por data (mais antigo primeiro), mostrando"[event_name]: [year]-[month]-[day] at [hour]:[minute] UTC" - Para
"details": Exibir"=== DETAILED INFORMATION ==="seguido por cada evento mostrando:"Event: [event_name]"" Date: [year]-[month]-[day]"" Time: [hour]:[minute] UTC"" Weekday: [weekday_name]"" Unix timestamp: [unix_seconds]"
- Para
"summary": Exibir"=== TIMELINE SUMMARY ==="seguido por:"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"
- Para
"years": Exibir"=== EVENTS BY DECADE ==="seguido pelos eventos agrupados por década, mostrando"[decade]s: [comma_separated_event_names]" - Exibir a mensagem de conclusão:
"Historical timeline processing completed"
Use o pacote time para criar datas específicas com time.Date, o pacote strings para dividir as strings de entrada, o pacote strconv para converter números em string para inteiros e o pacote fmt para saída formatada. Lembre-se que time.Date recebe parâmetros na ordem exata: ano, mês, dia, hora, minuto, segundo, nanossegundo, localização. Para ordenar cronologicamente, você pode comparar objetos time.Time usando o método Before(). Este desafio demonstra como criar momentos específicos no tempo e trabalhar com dados históricos usando as funcionalidades de tempo do Go.
Folha de consulta
Use time.Date para criar um objeto time.Time para uma data e hora específica:
birthday := time.Date(1990, time.March, 15, 14, 30, 0, 0, time.UTC)A função time.Date recebe sete parâmetros na ordem exata:
- ano (int)
- mês (time.Month ou int 1-12)
- dia (int)
- hora (int)
- minuto (int)
- segundo (int)
- nanosegundo (int)
- localização (*time.Location)
Use constantes de mês como time.March para melhor legibilidade, ou inteiros (1-12). Localizações comuns são time.UTC e time.Local.
Experimente você mesmo
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
"time"
)
func main() {
// Ler a entrada usando bufio.Scanner para lidar com espaços corretamente
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
eventsInput := scanner.Text()
scanner.Scan()
optionsInput := scanner.Text()
// Analisar eventos da entrada
eventEntries := strings.Split(eventsInput, ",")
// Analisar opções de exibição da entrada
displayOptions := strings.Split(optionsInput, ",")
// TODO: Escreva seu código abaixo
// 1. Analisar cada entrada de evento para extrair nome, ano, mês, dia, hora, minuto
// 2. Lembre-se de verificar se a fatia (slice) de partes tem elementos suficientes antes de acessar
// 3. Converter números em string para inteiros usando strconv.Atoi()
// 4. Criar objetos time.Time usando time.Date() para cada evento
// 5. Exibir o cabeçalho da aplicação e as mensagens de carregamento
// 6. Processar cada opção de exibição (chronological, details, summary, years)
// 7. Exibir a mensagem de conclusão
}Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Lógica & Fluxo
1Fluxo de Controle Avançado
Switch com `fallthrough`Interrompendo Loops AninhadosContinuando um Loop EspecíficoA Instrução `goto`Recapitulação - Controle de Loop Avançado4Projeto: Lista de Tarefas Simples
Configuração do ProjetoAdicionando uma Tarefa7Tratamento de Erros em Profundidade
Tipos de Erro PersonalizadosWrapping de Erros com `%w`Unwrapping com `errors.Is`Unwrapping com `errors.As`Entendendo o `panic`Usando o `recover`Recapitulação - Divisão Segura10Trabalhando com Tempo
Obtendo o Horário AtualCriando um Horário EspecíficoFormatando o TempoParsing de Strings de TempoDuração de TempoAritmética de TempoSleep e TickersRecapitulação - Timer Simples2Structs e Métodos
Definindo Métodos em StructsRecebedores de ValorRecebedores de PonteiroEscolhendo RecebedoresMétodos vs FunçõesRecapitulação - Comportamento de Structs5Mapas em Profundidade
Mapas de StructsPonteiros como Valores de MapVerificando Mapas NilComparando MapasRecapitulação - Contador de Frequência de Palavras3Interfaces (O Básico)
O que é uma Interface?Definindo uma InterfaceImplementando uma InterfaceUsando Tipos de InterfaceInterface VaziaAsserções de TipoType SwitchRecapitulação - Formas e Comportamentos