Menu
Coddy logo textTech

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 o 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 oito 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.

challenge icon

Desafio

Fácil

Crie um aplicativo de linha do tempo de eventos históricos que use time.Date para representar datas e horários específicos 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 é:

  1. Analisar a primeira entrada dividindo-a por vírgulas para obter entradas de eventos individuais
  2. Para cada entrada de evento, dividir por dois-pontos para extrair o nome do evento, ano, mês, dia, hora e minuto
  3. Converter as strings numéricas em inteiros e criar um objeto time.Time usando time.Date para cada evento (use time.UTC para o parâmetro de localização e 0 para segundos e nanossegundos)
  4. Exibir o cabeçalho da aplicação: "=== HISTORICAL TIMELINE APPLICATION ==="
  5. Exibir a confirmação de carregamento dos eventos: "Loading historical events..."
  6. Para cada evento, exibir: "Loaded: [event_name] - [complete_time_object]"
  7. Analisar a segunda entrada dividindo-a por vírgulas para obter as opções de exibição
  8. Processar cada opção de exibição:
    • Para "chronological": Exibir "=== CHRONOLOGICAL ORDER ===" seguido pelos eventos ordenados por data (o 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]"
  9. 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 ordenação cronológica, 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 a funcionalidade de tempo do Go.

Experimente você mesmo

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
	"time"
)

func main() {
	// Lê 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()
	
	// Analisa os eventos da entrada
	eventEntries := strings.Split(eventsInput, ",")
	
	// Analisa as opções de exibição da entrada
	displayOptions := strings.Split(optionsInput, ",")
	
	// TODO: Escreva seu código abaixo
	// 1. Analise cada entrada de evento para extrair name, year, month, day, hour, minute
	// 2. Lembre-se de verificar se o slice de partes tem elementos suficientes antes de acessar
	// 3. Converta números em string para inteiros usando strconv.Atoi()
	// 4. Crie objetos time.Time usando time.Date() para cada evento
	// 5. Exiba o cabeçalho da aplicação e as mensagens de carregamento
	// 6. Processe cada opção de exibição (chronological, details, summary, years)
	// 7. Exiba a mensagem de conclusão
	
}
quiz iconTeste seus conhecimentos

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