Formatando o Tempo
Parte da seção Lógica & Fluxo do Journey de GO da Coddy. Lição 60 de 68.
Depois de obter um objeto time.Time, muitas vezes você precisará convertê-lo em uma string em um formato legível. Go usa uma abordagem única para formatar horários, diferente da usada em outras linguagens de programação.
Em vez de usar códigos de formatação como %Y-%m-%d, Go usa uma data de referência como modelo. Essa data de referência é Mon Jan 2 15:04:05 MST 2006, que representa o momento exato: 2 de janeiro de 2006, às 15:04:05, no horário padrão das Montanhas.
now := time.Now()
formatted := now.Format("2006-01-02")
fmt.Println(formatted) // Saída: 2023-10-26A ideia principal é organizar os componentes da data de referência no padrão que você quer. Para o formato YYYY-MM-DD, você usa "2006-01-02", porque é assim que a data de referência aparece nesse padrão. Para um formato diferente, como Jan 2, 2006, você usaria "Jan 2, 2006".
Essa abordagem baseada em layout torna a formatação de hora do Go fácil de memorizar e flexível. Depois que você memoriza a data de referência, pode criar qualquer formato simplesmente organizando seus componentes no padrão desejado.
Desafio
FácilCrie um sistema de exibição de data e hora em vários formatos que formate objetos time.Time usando o sistema exclusivo de layouts com data de referência do Go. Este desafio testará sua capacidade de usar o método Format com diferentes padrões de layout para criar várias representações de data e hora.
Você receberá duas entradas:
- Uma string contendo informações de data no formato
"year:month:day:hour:minute"(por exemplo,"2023:12:25:14:30") - Uma string contendo solicitações de formato separadas por vírgulas no formato
"format1,format2,format3"(por exemplo,"iso,american,european,time12,time24")
Sua tarefa é:
- Analisar a primeira entrada separando-a pelos dois-pontos para extrair os valores de ano, mês, dia, hora e minuto
- Converter esses valores de string para inteiros usando o pacote
strconv - Criar um objeto
time.Timeusandotime.Datecom os valores analisados (usetime.UTCcomo localização, 0 para segundos e nanossegundos) - Exibir o cabeçalho do aplicativo:
"=== DATE/TIME FORMATTER ===" - Exibir o horário de origem:
"Source time: [complete_time_object]" - Analisar a segunda entrada separando-a pelas vírgulas para obter as solicitações de formato
- Exibir o cabeçalho de formatação:
"Formatted outputs:" - Para cada solicitação de formato, use a string de layout apropriada com o método
Format:- Para
"iso": use o layout"2006-01-02"e exiba"ISO format: [formatted_result]" - Para
"american": use o layout"01/02/2006"e exiba"American format: [formatted_result]" - Para
"european": use o layout"02/01/2006"e exiba"European format: [formatted_result]" - Para
"long": use o layout"January 2, 2006"e exiba"Long format: [formatted_result]" - Para
"time12": use o layout"3:04 PM"e exiba"12-hour time: [formatted_result]" - Para
"time24": use o layout"15:04"e exiba"24-hour time: [formatted_result]" - Para
"full": use o layout"Monday, January 2, 2006 at 3:04 PM"e exiba"Full format: [formatted_result]" - Para
"compact": use o layout"20060102"e exiba"Compact format: [formatted_result]"
- Para
- Calcular e exibir estatísticas:
"=== FORMATTING SUMMARY ===""Total formats applied: [number_of_format_requests]""Date components: [year]-[month]-[day]""Time components: [hour]:[minute]"
- Exibir informações de referência:
"=== REFERENCE DATE INFO ===""Go uses reference date: Mon Jan 2 15:04:05 MST 2006""This represents: January 2nd, 2006 at 3:04:05 PM""Layout patterns arrange these components as needed"
- Exibir a mensagem de conclusão:
"Date formatting completed using Go's layout system"
Use o pacote time para operações com horários, o pacote strings para dividir strings de entrada, o pacote strconv para converter strings em inteiros e o pacote fmt para saída formatada. Lembre-se de que a formatação de horários do Go usa a data de referência Mon Jan 2 15:04:05 MST 2006 como modelo, e você organiza esses componentes no padrão desejado. Este desafio demonstra como funciona o sistema exclusivo de formatação baseado em layouts do Go, fazendo com que você aplique vários padrões de formato diferentes ao mesmo objeto de horário.
Experimente você mesmo
package main
import (
"fmt"
"strconv"
"strings"
"time"
)
func main() {
// Leia a entrada
var dateInput string
var formatInput string
fmt.Scanln(&dateInput)
fmt.Scanln(&formatInput)
// Separe os componentes da data pelos dois-pontos
dateComponents := strings.Split(dateInput, ":")
// Converta os componentes de string em números inteiros
year, _ := strconv.Atoi(dateComponents[0])
month, _ := strconv.Atoi(dateComponents[1])
day, _ := strconv.Atoi(dateComponents[2])
hour, _ := strconv.Atoi(dateComponents[3])
minute, _ := strconv.Atoi(dateComponents[4])
// Crie um objeto time.Time
sourceTime := time.Date(year, time.Month(month), day, hour, minute, 0, 0, time.UTC)
// Analise as solicitações de formato
formatRequests := strings.Split(formatInput, ",")
// TODO: Escreva seu código abaixo
// Exiba o cabeçalho da aplicação
// Exiba o horário de origem
// Processe cada solicitação de formato e exiba as saídas formatadas
// Calcule e exiba as estatísticas
// Exiba as informações de referência
// Exiba 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 ComportamentosPratique por conta própria: Compilador de Go online