1: Introducción a Carbon

1.1 Introducción

Un paquete simple, semántico y amigable para desarrolladores en Golang para manejar fechas y horas.

Beneficios de usar Carbon para el manejo de fechas y horas:

  • Amigable para Desarrolladores: Carbon ofrece una interfaz fluida y expresiva para tratar con fechas y horas que es intuitiva para los desarrolladores.
  • Soporte de Internacionalización: Admite internacionalización, lo que te permite localizar tus representaciones de fecha.
  • Inmutabilidad: Las instancias de Carbon son inmutables, lo que significa que se pueden pasar de manera segura sin modificaciones inesperadas.
  • Manejo de Zonas Horarias: Carbon simplifica la complejidad de gestionar fechas y horas en diferentes zonas horarias.
  • API Extensa: Proporciona un conjunto completo de funciones para crear, analizar y formatear fechas y horas.

1.2 Guía de Instalación

Instalación para la versión de Go >= 1.16

Para instalar el paquete Carbon para Go versión 1.16 o superior, usa el siguiente comando:

go get -u github.com/golang-module/carbon/v2

Luego, importa el paquete en tu archivo de Go:

import "github.com/golang-module/carbon/v2"

Instalación para versiones de Go < 1.16

Para versiones anteriores de Go, aún puedes instalar Carbon utilizando:

go get -u github.com/golang-module/carbon

E impórtalo de manera similar:

import "github.com/golang-module/carbon"

Ten en cuenta que la versión 1 ya no se actualiza activamente, pero se mantendrá para correcciones de errores.

1.3 Configuración de tu Primer Proyecto Carbon

Configuración básica de Carbon: Una vez instalado Carbon, puedes empezar a usarlo simplemente creando una nueva instancia de Carbon. Puedes personalizar Carbon configurando el diseño global predeterminado, la zona horaria y el idioma para que se ajuste a las necesidades de tu proyecto.

Configuración del diseño global predeterminado, la zona horaria y el idioma:

carbon.SetDefault(carbon.Default{
  Layout: carbon.RFC3339Layout,
  Timezone: carbon.PRC,
  Locale: "en",
})

Si no se establece explícitamente, Carbon tiene la configuración predeterminada para estos — Layout: "2006-01-02 15:04:05", Timezone: Local, Locale: "en".

2: Operaciones Básicas de Carbon

2.1 Trabajando con la Hora Actual

Obtención de la Fecha y Hora Actual

Recuperar la fecha y hora actuales es una operación fundamental en muchas aplicaciones. Con Carbon, puedes adquirir la instancia de fecha y hora actual llamando al método carbon.Now(). Veamos cómo obtener la fecha y hora actuales:

// Obtiene la fecha y hora actuales como una instancia de Carbon.
now := carbon.Now()

fmt.Println("Fecha y hora actuales:", now)

Mostrar Hoy, Ayer y Mañana

Carbon proporciona una manera elegante de trabajar con fechas en relación al día actual. Para obtener la representación de la fecha y hora actual, de ayer y de mañana, puedes usar los métodos carbon.Now(), carbon.Yesterday() y carbon.Tomorrow() respectivamente:

// Fecha y hora de hoy
hoy := carbon.Now()
fmt.Println("Hoy:", hoy.ToDateTimeString())

// Fecha y hora de ayer
ayer := carbon.Yesterday()
fmt.Println("Ayer:", ayer.ToDateTimeString())

// Fecha y hora de mañana
mañana := carbon.Tomorrow()
fmt.Println("Mañana:", mañana.ToDateTimeString())

Estos métodos proporcionan una forma concisa de interactuar con estas referencias de fecha comúnmente utilizadas sin cálculos manuales.

Formateo y Representación de la Hora Actual

Carbon facilita diferentes formas de formatear y mostrar la fecha y hora. Ya sea que necesites un formato estándar como ISO8601, un formato personalizado o una versión localizada, Carbon tiene métodos para satisfacer estos requisitos.

Así es como puedes formatear la fecha y hora actuales de diversas maneras:

// Representación estándar de la fecha y hora
fmt.Println("RFC3339:", now.ToRFC3339String())
fmt.Println("ISO8601:", now.ToIso8601String())

// Formato de fecha y hora personalizado
fmt.Println("Personalizado:", now.Format("Monday, 02-Jan-06 15:04:05 MST"))

// Usando diseños predefinidos
fmt.Println("Formato ANSIC:", now.ToAnsicString())
fmt.Println("Formato UnixDate:", now.ToUnixDateString())
fmt.Println("Formato RubyDate:", now.ToRubyDateString())
fmt.Println("Formato Kitchen:", now.ToKitchenString())

// Para patrones personalizados, utiliza el método Format
fmt.Println("Patrón personalizado:", now.Format("2006-01-02 3:04 PM"))

2.2 Creación de Instancias de Carbon

Creación de instancias a partir de marcas de tiempo

En Go, es frecuente trabajar con marcas de tiempo, y Carbon proporciona métodos intuitivos para manejarlas. Una marca de tiempo es una secuencia de caracteres o información codificada que identifica cuándo ocurrió un cierto evento, generalmente dando la fecha y hora del día, a veces precisa hasta una pequeña fracción de segundo.

Para crear una instancia de Carbon a partir de una marca de tiempo Unix, que representa el número de segundos que han transcurrido desde la época de Unix (medianoche del 1 de enero de 1970, UTC), puedes utilizar varios niveles de precisión:

// Crear una instancia de Carbon a partir de una marca de tiempo dada con precisión de segundo
c1 := carbon.CreateFromTimestamp(1596604455)
fmt.Println(c1.ToString()) // Salida: "202-08-05 13:14:15 +080 CST"

// Para una mayor precisión (milisegundos), utiliza `CreateFromTimestampMilli`
c2 := carbon.CreateFromTimestampMilli(1596604455999)
fmt.Println(c2.ToString()) // Salida: "202-08-05 13:14:15.999 +080 CST"

// Para microsegundos, utiliza `CreateFromTimestampMicro`
c3 := carbon.CreateFromTimestampMicro(1596604455999999)
fmt.Println(c3.ToString()) // Salida: "202-08-05 13:14:15.999999 +080 CST"

// Y para nanosegundos, utiliza `CreateFromTimestampNano`
c4 := carbon.CreateFromTimestampNano(1596604455999999999)
fmt.Println(c4.ToString()) // Salida: "202-08-05 13:14:15.999999999 +080 CST"

Creación de instancias a partir de componentes de fecha y hora

Si tienes los componentes individuales de una fecha, como el año, el mes y el día, o los componentes de una hora, como la hora, el minuto y el segundo, Carbon también puede manejarlos.

// Crear una instancia de Carbon a partir de una fecha dada solamente
fecha := carbon.CreateFromDate(2022, 12, 25)
fmt.Println(fecha.ToDateString()) // Salida: "2022-12-25"

// Crear una instancia de Carbon a partir de una hora dada solamente
hora := carbon.CreateFromTime(23, 59, 59)
fmt.Println(hora.ToTimeString()) // Salida: "23:59:59"

// Crear una instancia de Carbon a partir de una fecha y hora
fechaHora := carbon.CreateFromDateTime(2022, 12, 25, 23, 59, 59)
fmt.Println(fechaHora.ToDateTimeString()) // Salida: "2022-12-25 23:59:59"

2.3 Análisis de cadenas de tiempo

Manejar representaciones de fecha y hora como cadenas es un escenario común. Carbon hace conveniente analizar cadenas en instancias de Carbon.

Uso de carbon.Parse para formatos de tiempo estándar:

// Analizar una cadena con fecha y hora
c := carbon.Parse("202-08-05 13:14:15", carbon.PRC)
if c.Error != nil {
    fmt.Printf("Error: %v", c.Error)
} else {
    fmt.Println(c.ToDateTimeString()) // Salida: "202-08-05 13:14:15"
}

// Analizar una cadena con formato RFC3339
rfc3339 := carbon.Parse("202-08-05T13:14:15+08:00")
fmt.Println(rfc3339.ToString()) // Salida: "202-08-05 13:14:15 +080 CST"

Formatos personalizados con ParseByFormat y ParseByLayout

También puedes analizar cadenas que tienen un formato específico no manejado directamente por carbon.Parse.

// Analizar una cadena de tiempo como instancia de Carbon por formato
porFormato := carbon.ParseByFormat("202|08|05 13|14|15", "2006|01|02 15|04|05")
fmt.Println(porFormato.ToDateTimeString()) // Salida: "202-08-05 13:14:15"

// Analizar una cadena de tiempo como instancia de Carbon por diseño
porDiseño := carbon.ParseByLayout("202|08|05", "2006|01|02")
fmt.Println(porDiseño.ToDateString()) // Salida: "202-08-05"

Manejo de errores

Siempre verifica el campo Error para asegurarte de que el análisis se realizó con éxito:

fechaInvalida := carbon.Parse("Esto no es una fecha", carbon.PRC)
if fechaInvalida.IsInvalid() {
    fmt.Println("Error al analizar la fecha:", fechaInvalida.Error)
}

Recuerda que una verificación de errores robusta es una parte crítica del trabajo con fechas y horas para prevenir resultados inesperados o fallas del sistema.