9. Formatear fechas en Javascript
Formatear Fechas en JavaScript con Day.js
1. Introducción a Day.js
1.1. ¿Por qué Day.js?
En Laravel con Blade, tenemos Carbon para manipular fechas fácilmente:
php
{{ $chatbot->created_at->diffForHumans() }} // "hace 2 días"
Pero en JavaScript necesitamos una alternativa. Day.js es:
✅ Minimalista - Solo 2KB (comprimido)
✅ Rápido - Sin dependencias pesadas
✅ Similar a Moment.js - Misma API, más ligero
✅ Modular - Carga solo lo que necesitas
1.2. Comparación de Librerías
2. Instalación de Day.js
2.1. Instalar Dependencia
bash
npm install --save-dev dayjs
2.2. Verificar Instalación
json
// package.json
"devDependencies": {
"dayjs": "^1.11.0"
}
3. Uso Básico de Day.js
3.1. Uso Directo en Componente
vue
<script setup>
import dayjs from 'dayjs'
defineProps({
chatbot: {
type: Object,
required: true
}
})
</script>
<template>
<div class="text-sm text-gray-500">
{{ dayjs(chatbot.created_at).format('DD/MM/YYYY HH:mm') }}
</div>
</template>
3.2. Formato Predeterminado
Por defecto, Day.js muestra el formato ISO:
javascript
dayjs('2024-07-20T15:30:00.000Z').toString()
// "Sat Jul 20 2024 15:30:00 GMT+0000"
4. Formateo de Fechas
4.1. Método format()
javascript
const date = dayjs('2024-07-20T15:30:00.000Z')
// Formatos comunes
date.format('DD/MM/YYYY') // "20/07/2024"
date.format('MM/DD/YYYY') // "07/20/2024"
date.format('YYYY-MM-DD') // "2024-07-20"
date.format('DD/MM/YYYY HH:mm') // "20/07/2024 15:30"
date.format('LLL') // "July 20, 2024 3:30 PM"
4.2. Tokens de Formato
5. Tiempos Relativos (fromNow)
5.1. Instalar Plugin de Tiempo Relativo
javascript
import dayjs from 'dayjs'
import relativeTime from 'dayjs/plugin/relativeTime'
// Extender Day.js con el plugin
dayjs.extend(relativeTime)
5.2. Uso de fromNow()
vue
<script setup>
import dayjs from 'dayjs'
// Fecha de ejemplo
const createdAt = '2024-07-20T15:30:00.000Z'
// Tiempo relativo
const timeAgo = dayjs(createdAt).fromNow()
// "a few seconds ago"
// "5 minutes ago"
// "2 hours ago"
// "3 days ago"
</script>
<template>
<div class="text-sm text-gray-500">
Creado {{ dayjs(chatbot.created_at).fromNow() }}
</div>
</template>
5.3. Comparación de Métodos
javascript
const date = dayjs('2024-07-20T15:30:00.000Z')
// Tiempo relativo
date.fromNow() // "2 days ago"
date.fromNow(true) // "2 days"
date.toNow() // "in 2 days"
// Diferencia absoluta
date.from(dayjs()) // "2 days ago"
date.to(dayjs()) // "in 2 days"
6. Localización (Internacionalización)
6.1. Configurar Idioma
javascript
import dayjs from 'dayjs'
import 'dayjs/locale/es' // Para español
dayjs.locale('es')
6.2. Ejemplo en Español
Antes (inglés):
javascript
dayjs().format('LLL') // "July 20, 2024 3:30 PM"
dayjs('2024-07-20').fromNow() // "2 days ago"
Después (español):
javascript
dayjs.locale('es')
dayjs().format('LLL') // "20 de julio de 2024 15:30"
dayjs('2024-07-20').fromNow() // "hace 2 días"
6.3. Otros Idiomas
javascript
// Alemán
import 'dayjs/locale/de'
dayjs.locale('de')
// Francés
import 'dayjs/locale/fr'
dayjs.locale('fr')
// Japonés
import 'dayjs/locale/ja'
dayjs.locale('ja')
7. Configuración Centralizada
7.1. Crear Utilidad de Fechas
Crear resources/js/utils/dayjs.js:
javascript
import dayjs from 'dayjs'
import relativeTime from 'dayjs/plugin/relativeTime'
// Importar idioma español
import 'dayjs/locale/es'
// Extender con plugins
dayjs.extend(relativeTime)
// Configurar locale
dayjs.locale('es')
// Exportar instancia configurada
export default dayjs
// Funciones de ayuda
export const formatDate = (date, format = 'DD/MM/YYYY HH:mm') => {
return dayjs(date).format(format)
}
export const timeAgo = (date) => {
return dayjs(date).fromNow()
}
7.2. Uso en Componentes
vue
<script setup>
// Importar la utilidad configurada
import dayjs, { formatDate, timeAgo } from '@/utils/dayjs'
defineProps({
chatbot: {
type: Object,
required: true
}
})
</script>
<template>
<div>
<!-- Usando la función helper -->
<div class="text-sm text-gray-500">
Creado: {{ formatDate(chatbot.created_at) }}
</div>
<div class="text-xs text-gray-400">
{{ timeAgo(chatbot.created_at) }}
</div>
<!-- Usando dayjs directamente -->
<div class="text-xs text-gray-400">
Última actualización: {{ dayjs(chatbot.updated_at).format('DD/MM/YYYY') }}
</div>
</div>
</template>
8. Plugins Adicionales
8.1. Plugins Populares
javascript
import dayjs from 'dayjs'
import relativeTime from 'dayjs/plugin/relativeTime'
import utc from 'dayjs/plugin/utc'
import timezone from 'dayjs/plugin/timezone'
import isBetween from 'dayjs/plugin/isBetween'
import isToday from 'dayjs/plugin/isToday'
import calendar from 'dayjs/plugin/calendar'
// Extender con plugins
dayjs.extend(relativeTime)
dayjs.extend(utc)
dayjs.extend(timezone)
dayjs.extend(isBetween)
dayjs.extend(isToday)
dayjs.extend(calendar)
8.2. Ejemplos de Uso
javascript
// UTC y Timezone
dayjs.utc('2024-07-20T15:30:00Z').tz('America/Guayaquil')
// Verificar si está entre fechas
dayjs('2024-07-20').isBetween('2024-07-01', '2024-07-31') // true
// Verificar si es hoy
dayjs().isToday() // true
// Formato calendario
dayjs().calendar() // "Today at 3:30 PM"
dayjs('2024-07-19').calendar() // "Yesterday at 3:30 PM"
dayjs('2024-07-15').calendar() // "07/15/2024"
9. Ejemplos Prácticos
9.1. Componente ChatbotListItem Completo
vue
<script setup>
import dayjs, { formatDate, timeAgo } from '@/utils/dayjs'
import { Link } from '@inertiajs/vue3'
import { PrimaryButton, SecondaryButton, DangerButton } from '@/Components/Buttons'
defineProps({
chatbot: {
type: Object,
required: true
}
})
</script>
<template>
<div class="flex flex-col md:flex-row md:items-center md:justify-between py-4">
<div class="flex-1">
<div class="text-gray-800 dark:text-gray-200 font-medium">
{{ chatbot.name }}
</div>
<!-- Varias formas de mostrar la fecha -->
<div class="flex flex-wrap gap-x-4 text-sm">
<!-- Formato largo -->
<span class="text-gray-500 dark:text-gray-400">
<span class="font-medium">Creado:</span>
{{ formatDate(chatbot.created_at) }}
</span>
<!-- Tiempo relativo -->
<span class="text-gray-500 dark:text-gray-400">
<span class="font-medium">Hace:</span>
{{ timeAgo(chatbot.created_at) }}
</span>
<!-- Formato personalizado -->
<span class="text-gray-500 dark:text-gray-400">
{{ dayjs(chatbot.created_at).format('dddd, D [de] MMMM [de] YYYY') }}
</span>
</div>
<!-- Mostrar modelo y temperatura -->
<div class="flex gap-x-4 mt-1 text-xs text-gray-400 dark:text-gray-500">
<span>Modelo: {{ chatbot.model }}</span>
<span>Temp: {{ chatbot.temperature }}</span>
</div>
</div>
<div class="flex space-x-2 mt-4 md:mt-0">
<PrimaryButton as="a" :href="route('chatbots.show', chatbot.id)">
Ver
</PrimaryButton>
<SecondaryButton as="a" :href="route('chatbots.edit', chatbot.id)">
Editar
</SecondaryButton>
<DangerButton @click="$emit('delete', chatbot.id)">
Eliminar
</DangerButton>
</div>
</div>
</template>
9.2. Formato de Fecha por Tipo
javascript
// En utils/dayjs.js
export const formatDateByType = (date, type = 'standard') => {
const d = dayjs(date)
const formats = {
standard: 'DD/MM/YYYY HH:mm',
date: 'DD/MM/YYYY',
time: 'HH:mm:ss',
full: 'dddd, D [de] MMMM [de] YYYY HH:mm',
short: 'DD/MM/YY',
iso: 'YYYY-MM-DDTHH:mm:ssZ'
}
return d.format(formats[type] || formats.standard)
}
9.3. Filtro de Fechas en Vue
vue
<script setup>
import { computed } from 'vue'
import { formatDate } from '@/utils/dayjs'
const props = defineProps({
chatbots: {
type: Array,
required: true
}
})
// Agrupar por fecha
const groupedChatbots = computed(() => {
const groups = {}
props.chatbots.forEach(chatbot => {
const date = formatDate(chatbot.created_at, 'YYYY-MM-DD')
if (!groups[date]) {
groups[date] = []
}
groups[date].push(chatbot)
})
return groups
})
</script>
<template>
<div v-for="(group, date) in groupedChatbots" :key="date">
<h3 class="text-lg font-semibold">{{ formatDate(date, 'full') }}</h3>
<ChatbotListItem v-for="chatbot in group" :key="chatbot.id" :chatbot="chatbot" />
</div>
</template>
10. Solución de Problemas
10.1. Day.js no encuentra el locale
Problema:
text
Error: Locale "es" is not loaded
Solución:
javascript
import 'dayjs/locale/es' // Asegurar importación
dayjs.locale('es')
10.2. Plugin no cargado
Problema:
text
TypeError: dayjs(...).fromNow is not a function
Solución:
javascript
import relativeTime from 'dayjs/plugin/relativeTime'
dayjs.extend(relativeTime)
10.3. Fechas en diferente formato
Solución con parse:
javascript
// Formato específico
dayjs('20-07-2024', 'DD-MM-YYYY')
// Custom parse
dayjs('2024-07-20T15:30:00.000Z').format('DD/MM/YYYY')
11. Resumen
11.1. Archivos Creados
11.2. Comandos Utilizados
bash
# Instalación
npm install --save-dev dayjs
# Usar en componente
import dayjs from '@/utils/dayjs'
11.3. Características Implementadas
✅ Formateo de fechas (DD/MM/YYYY, HH:mm, etc.)
✅ Tiempos relativos (hace X días)
✅ Soporte para español
✅ Configuración centralizada y reutilizable
✅ Plugins para funcionalidades avanzadas
¡Ahora las fechas son mucho más legibles y amigables!
Comentarios
Publicar un comentario