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.

Embora time.Now() forneça o momento atual, você frequentemente precisará trabalhar com datas e horários específicos. Go fornece a função time.Date para criar um objeto time.Time que representa qualquer data e horário que você especificar.

A função time.Date aceita oito parâmetros nesta ordem exata: ano, mês, dia, hora, minuto, segundo, nanossegundo e localização. Esta é a sintaxe básica:

birthday := time.Date(1990, time.March, 15, 14, 30, 0, 0, time.UTC)

Observe que Go usa constantes como time.March para os meses, o que torna seu código mais legível do que usar números. Você também pode usar 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.

Essa abordagem dá a você controle total para criar 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 uma aplicação 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 capacidade 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" (por exemplo, "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" (por exemplo, "chronological,details,summary")

Sua tarefa é:

  1. Analisar a primeira entrada dividindo-a por vírgulas para obter entradas de event individuais
  2. Para cada entrada de event, dividi-la por dois-pontos para extrair o nome do evento, o ano, o mês, o dia, a hora e o minuto
  3. Converter as strings numéricas em inteiros e criar um objeto time.Time usando time.Date para cada evento (use time.UTC como 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 (do mais antigo ao mais recente), mostrando "[event_name]: [year]-[month]-[day] at [hour]:[minute] UTC"
    • Para "details": exibir "=== DETAILED INFORMATION ===" seguido de 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 de:
      • "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 strings de entrada, o pacote strconv para converter números em strings para inteiros e o pacote fmt para a saída formatada. Lembre-se de que time.Date recebe os 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 a funcionalidade de tempo do Go.

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 os eventos a partir da entrada
	eventEntries := strings.Split(eventsInput, ",")
	
	// Analisar as opções de exibição a partir 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 parts 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. Process each display option (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

Pratique por conta própria: Compilador de Go online