Menu
CoddyTech

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, muitas vezes você precisará trabalhar com datas e horários específicos. Go oferece a função time.Date para criar um objeto time.Time que represente qualquer data e horário 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 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 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.

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 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 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 as entradas individuais dos eventos
  2. Para cada entrada de evento, 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 para o parâmetro de localização e 0 para segundos e nanossegundos)
  4. Exibir o cabeçalho do aplicativo: "=== 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 dos 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 destas linhas para cada evento (as últimas quatro são recuadas em dois espaços):
      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 dos eventos agrupados por década, mostrando "[decade]s: [comma_separated_event_names]"
  9. Exibir a mensagem de conclusão: "Historical timeline processing completed"

Regras de formatação: a linha Loaded: imprime o valor de time.Time como ele é, usando %v; por exemplo, Loaded: Moon Landing - 1969-07-20 20:17:00 +0000 UTC. Todas as outras datas e horários são montados manualmente: o mês, o dia e a hora não têm zero à esquerda, e o minuto sempre tem dois dígitos (%02d), então o mesmo evento é impresso como Moon Landing: 1969-7-20 at 20:17 UTC, e o minuto 0 é impresso como 21:00. [unix_seconds] corresponde a Unix(), que é negativo para datas anteriores a 1970. Na lista de décadas, as décadas vão da mais antiga à mais recente, e os nomes de cada década são unidos por uma vírgula sem espaço, na ordem em que aparecem na entrada.

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 formato de string em inteiros e o pacote fmt para saída formatada. Lembre-se de que time.Date recebe os parâmetros nesta 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 os recursos de tempo do Go.

Experimente você mesmo

package main

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

func main() {
	// Leia a entrada usando bufio.Scanner para lidar corretamente com os espaços
	scanner := bufio.NewScanner(os.Stdin)
	
	scanner.Scan()
	eventsInput := scanner.Text()
	
	scanner.Scan()
	optionsInput := scanner.Text()
	
	// Analise os eventos da entrada
	eventEntries := strings.Split(eventsInput, ",")
	
	// Analise 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 nome, ano, mês, dia, hora e minuto
	// 2. Lembre-se de verificar se o slice parts tem elementos suficientes antes de acessá-los
	// 3. Converta números em formato de 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 (cronológica, detalhes, resumo, anos)
	// 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