Formatando o Tempo
Parte da seção Lógica & Fluxo do Journey de GO da Coddy — lição 60 de 68.
Uma vez que você tenha um objeto time.Time, você frequentemente precisará convertê-lo em um formato de string legível. Go usa uma abordagem única para formatação de tempo que é diferente de outras linguagens de programação.
Em vez de usar códigos de formatação como %Y-%m-%d, o Go usa uma data de referência como modelo. Esta 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 (3:04:05 PM) Mountain Standard Time.
now := time.Now()
formatted := now.Format("2006-01-02")
fmt.Println(formatted) // Saída: 2023-10-26A ideia principal é que você organiza os componentes da data de referência no padrão que deseja. Para um 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 tempo do Go memorável e flexível. Depois de se lembrar da data de referência, você pode criar qualquer formato simplesmente organizando seus componentes no padrão desejado.
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 sistema de exibição de data e hora multi-formato que formata objetos time.Time usando o sistema exclusivo de layout de data de referência do Go. Este desafio testará sua habilidade 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"(ex:"2023:12:25:14:30") - Uma string contendo solicitações de formato separadas por vírgulas no formato
"format1,format2,format3"(ex:"iso,american,european,time12,time24")
Sua tarefa é:
- Analisar a primeira entrada dividindo-a por 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.UTCpara a localização, 0 para segundos e nanossegundos) - Exibir o cabeçalho da aplicação:
"=== DATE/TIME FORMATTER ===" - Exibir o tempo de origem:
"Source time: [complete_time_object]" - Analisar a segunda entrada dividindo-a por 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 de tempo, o pacote strings para dividir as 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 tempo do Go usa a data de referência Mon Jan 2 15:04:05 MST 2006 como um modelo, e você organiza esses componentes no padrão que desejar. Este desafio demonstra como o sistema exclusivo de formatação baseado em layout do Go funciona, fazendo com que você aplique vários padrões de formato diferentes ao mesmo objeto de tempo.
Folha de consulta
Go usa uma abordagem única de data de referência para formatação de tempo: Mon Jan 2 15:04:05 MST 2006
Para formatar um objeto time.Time, use o método Format com padrões de layout baseados na data de referência:
now := time.Now()
formatted := now.Format("2006-01-02")
fmt.Println(formatted) // Saída: 2023-10-26Padrões de layout comuns:
"2006-01-02"- Formato ISO (AAAA-MM-DD)"01/02/2006"- Formato americano (MM/DD/AAAA)"02/01/2006"- Formato europeu (DD/MM/AAAA)"January 2, 2006"- Formato longo"3:04 PM"- Horário de 12 horas"15:04"- Horário de 24 horas"Monday, January 2, 2006 at 3:04 PM"- Formato completo"20060102"- Formato compacto
A chave é organizar os componentes da data de referência no padrão desejado.
Experimente você mesmo
package main
import (
"fmt"
"strconv"
"strings"
"time"
)
func main() {
// Ler entrada
var dateInput string
var formatInput string
fmt.Scanln(&dateInput)
fmt.Scanln(&formatInput)
// Analisar componentes da data dividindo por dois-pontos
dateComponents := strings.Split(dateInput, ":")
// Converter componentes de string para 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])
// Criar objeto time.Time
sourceTime := time.Date(year, time.Month(month), day, hour, minute, 0, 0, time.UTC)
// Analisar solicitações de formato
formatRequests := strings.Split(formatInput, ",")
// TODO: Escreva seu código abaixo
// Exibir o cabeçalho da aplicação
// Exibir o horário de origem
// Processar cada solicitação de formato e exibir as saídas formatadas
// Calcular e exibir estatísticas
// Exibir informações de referência
// Exibir 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