# Trabajar con fechas y horas

{% hint style="info" %}
MaviBot funciona con los siguientes formatos de FECHA y HORA:

para fechas – **"dd.mm.aaaa"**\
para hora – **"HH:MM"**
{% endhint %}

### Variables

Para trabajar con fechas y hora, puedes usar las siguientes variables:

**current\_date** - fecha actual en formato dd.mm.aaaa, según la zona horaria del proyecto\
**next\_day** - fecha de mañana en formato dd.mm.aaaa; útil para programar mensajes\
**current\_time** - hora actual en formato hh:mm, según la zona horaria del proyecto\
**weekday** - día de la semana como número: lunes = 1, martes = 2, etc.

**Acceso rápido a las descripciones de las funciones:**

* [Sumar tiempo a tiempo](#how-to-add-time-to-time)&#x20;
* [Comparar hora](#how-to-compare-time)&#x20;
* [Establecer intervalos de tiempo](#how-to-set-time-intervals)&#x20;
* [Calcular el tiempo hasta el día D ](#how-to-find-out-how-much-time-is-left-until-day-d)
* [Encontrar el próximo cumpleaños](#how-to-find-out-the-next-birthday)&#x20;
* [Obtener la fecha de un día de la semana específico ](#how-to-get-the-date-of-a-specific-weekday)
* [Obtener la fecha de un día específico del mes](#how-to-get-the-date-of-a-specific-day-of-month)&#x20;
* [Comprobar si está dentro del horario laboral](#how-to-check-if-the-current-time-is-within-working-hours)

### Cómo sumar tiempo a tiempo&#x20;

{% hint style="info" %}
Puedes comparar fechas y horas usando operadores lógicos igual que con los números.
{% endhint %}

**addYear() | addMonth() | addDays() | addMinutes()**

<details>

<summary>Descripción</summary>

**addYear(date, years\_to\_add) -** calcula una nueva fecha sumando el número especificado de años a la fecha dada, teniendo en cuenta los años bisiestos. Usa un número negativo para restar años.

**addMonth(date, months\_to\_add)** - calcula una nueva fecha sumando el número especificado de meses a la fecha dada, teniendo en cuenta los años bisiestos. Usa un número negativo para restar meses.

**addDays(date, days\_to\_add) -** suma el número especificado de días a la fecha. Usa un número negativo para restar días. Ejemplo: `addDays(current_date, 20)` o `addDays('20.08.2019', -99)`

**addMinutes(time, minutes\_to\_add) -** suma el número especificado de minutos a la hora. Usa un número negativo para restar minutos. Ejemplo: `addMinutes(current_time, 20)` o `addMinutes('20:08', -30)`

**'date' + days** - suma el número especificado de días a la fecha

**'time' + minutes** - suma el número especificado de minutos a la hora

</details>

<details>

<summary>Ejemplos</summary>

Ejemplo de suma de una cierta cantidad de años a una fecha:

<div data-with-frame="true"><figure><img src="/files/b449855523321fa0c64fe45ee916366523ac86b0" alt="" width="563"><figcaption></figcaption></figure></div>

<div data-with-frame="true"><figure><img src="/files/401a8d729fc967cb30bf9ee04203772320c9dcae" alt="" width="375"><figcaption></figcaption></figure></div>

Ejemplo de suma de una cierta cantidad de meses a una fecha:

<div data-with-frame="true"><figure><img src="/files/bc24bcb038d2abe1a1b43b77b0e98f6a96ce34e9" alt="" width="563"><figcaption></figcaption></figure></div>

<div data-with-frame="true"><figure><img src="/files/38d2acf708ff6c73695446edd07268b1619f8b97" alt="" width="375"><figcaption></figcaption></figure></div>

Ejemplo de uso de una operación matemática simple: sumar días a una fecha y minutos a una hora:

<div data-with-frame="true"><figure><img src="/files/8b2a743b1671ce8026d96040e0efac8f80c28c39" alt="" width="375"><figcaption></figcaption></figure></div>

<div data-with-frame="true"><figure><img src="/files/dd9c4875e98ff37d47994c4a161bd7145dce3ed5" alt="" width="375"><figcaption></figcaption></figure></div>

</details>

<details>

<summary>Ejemplo de código para copiar</summary>

`count = 2`\
`date = '29.02.2020'`\
`x = addYear(date, count)`\
`y = addYear('31.12.2021', -1*count)`

`count = 10`\
`date = '30.04.2019'`\
`x = addMonth(date, count)`\
`y = addMonth('31.12.2020', -1*count)`

`count = 10`\
`date = '30.04.2019'`\
`x = addMonth(date, count)`\
`y = addMonth('31.12.2020', -1*count)`

</details>

### Cómo comparar hora&#x20;

<details>

<summary>Descripción</summary>

Puedes comparar fechas y horas usando operadores lógicos igual que con los números:\
mayor que > , menor que <\
igual a == , distinto de !=\
mayor o igual que >= , menor o igual que <=

Las condiciones de comparación también se pueden combinar usando los operadores lógicos AND y OR.

{% hint style="warning" %}
**Las condiciones de comparación deben ser lógicamente coherentes**, lo que significa que no puedes crear condiciones como a == 1 y a != 1, ya que un valor no puede ser igual y distinto de 1 al mismo tiempo.
{% endhint %}

Las condiciones de comparación se introducen en el **"Variable"** campo.

<div data-with-frame="true"><figure><img src="/files/16245eba6fb3543e5ac8828c1d646ec847f96753" alt="" width="563"><figcaption></figcaption></figure></div>

Asegúrate de usar retrasos al especificar las condiciones de comparación en una flecha.

<div data-with-frame="true"><figure><img src="/files/1d64249f45f77100bc73cb36695f4399f3edec40" alt="" width="563"><figcaption></figcaption></figure></div>

</details>

<details>

<summary>Ejemplo</summary>

`'01.09.2020'`` `*`< '11.10.2020'`*&#x20;

*`'11.10.2020' >=`*` ``current_date`

`current_date == date`

`current_time >= '18:00'`&#x20;

`current_time <= '21:00'`

</details>

### &#x20;Cómo establecer intervalos de tiempo

<details>

<summary>Descripción</summary>

Una función muy útil para trabajar con intervalos de tiempo es:

**time\_interval('start\_time', 'end\_time')**

La función devuelve lógico **True** o **Falso**.

Usa esta función en bloques como condición en el **"Variable a comparar"** campo o dentro de una calculadora usando IF().

{% hint style="info" %}
La función permite comprobar si **la hora actual** se encuentra dentro del intervalo especificado.
{% endhint %}

</details>

<details>

<summary>Ejemplo</summary>

`time_interval('10:00','19:00') - comprueba el intervalo de tiempo de 10:00 a 19:00`

`time_interval('19:00','07:00') - comprueba el intervalo de tiempo de 19:00 a 07:00`

`time_interval('18.10.2021 10:00','25.10.2021 23:59:59') - comprueba el intervalo de tiempo entre distintas fechas`

`time_interval('#{current_date} 10:00','#{date} 19:00') - comprueba el intervalo de tiempo establecido usando variables`

Veamos más de cerca el primer ejemplo. La función se interpreta de la siguiente manera:

Si el usuario envía un mensaje que contiene la palabra "time" durante el período de 10:00 a 19:00, la condición devuelve true; de lo contrario, devuelve false.

Esto te permite crear respuestas diferentes según la hora de la solicitud del cliente.\
Por ejemplo, si la hora actual está entre las 10:00 y las 19:00, el cliente recibirá:&#x20;***"Un gerente te responderá en breve."***

A cualquier otra hora, recibirá:&#x20;***"El gerente no está disponible en este momento; recibirás una respuesta durante el horario laboral a partir de las 10:00."***

En el campo Calculadora, introduce:

`response = if(time_interval('10:00','19:00'), "Un gerente te responderá en breve", "El gerente no está disponible en este momento; recibirás una respuesta durante el horario laboral a partir de las 10:00")`

En el campo "Mensaje", introduce: `#{response}`

<div data-with-frame="true"><figure><img src="/files/3f6ca4dc32e6f72e3b48166c161416cc6b379c86" alt="" width="563"><figcaption></figcaption></figure></div>

<div data-with-frame="true"><figure><img src="/files/c5d26da2b77264e10623b316315b68d2d5ac0b10" alt="" width="563"><figcaption></figcaption></figure></div>

</details>

<details>

<summary>Ejemplo de código para copiar</summary>

`response = if(time_interval('10:00','19:00'), "Un gerente te responderá en breve", "El gerente no está disponible en este momento; recibirás una respuesta durante el horario laboral a partir de las 10:00")`

</details>

### Cómo averiguar cuánto tiempo falta hasta el día D

<details>

<summary>Ejemplo</summary>

<div data-with-frame="true"><figure><img src="/files/526ff42dec786e5e6a95eac92414903718d18f23" alt="" width="563"><figcaption></figcaption></figure></div>

Para calcular cuánto tiempo falta hasta el día D:

Define la fecha y la hora del momento objetivo hasta el que deseas hacer la cuenta atrás.

`date_D = 10.10.2021 time_D = 12:00`

Convértelo a formato **timestamp** :

`timestampD = convert_datetime("#{date_D} #{time_D}", "%d.%m.%Y %H:%M", "%s")`

Captura la hora actual en **timestamp** :

`timestamp0 = #{timestamp}`

Redondea los valores obtenidos a números enteros:&#x20;

`timeD = int(#{timestampD}) time0 = int(#{timestamp0})`

Calcula la diferencia en segundos:

`time = timeD - time0`

Divide por el número de segundos en un día y redondea el resultado:

`full_days = time/86400`&#x20;

`days = int(#{full_days})`

Calcula cuántos segundos quedan del día parcial:

`c = days*86400`&#x20;

`d = time - c`

Calcula a cuántas horas corresponde esto y redondea el valor:

`e = d/3600 hours = int(e)`

Calcula cuántos segundos quedan de las horas parciales:

`g = hours*3600`&#x20;

`h = d - g`

Convierte esto a minutos y redondea el valor:&#x20;

`i = h/60`&#x20;

`minutes = int(i)`

Calcula cuántos segundos quedan:

`k = minutes*60`&#x20;

`seconds = h - k`

Y muestra el tiempo en el **"Texto del mensaje"** :

Tiempo restante hasta el inicio: #{days} días #{hours} horas #{minutes} minutos y #{seconds} segundos

Aquí está el código para insertar en el **"Calculadora"** :

```
timestampD = convert_datetime("#{date_D} #{time_D}", "%d.%m.%Y %H:%M", "%s")
timestamp0 = #{timestamp}
timeD = int(#{timestampD})
time0 = int(#{timestamp0})
time = timeD - time0
full_days = time/86400
days = int(#{days})
c = days*86400
d = time - c
e = d/3600
hours = int(e)
g = hours*3600 
h = d - g
i = h/60 
minutes = int(i)
k = minutes*60 
seconds = h - k
```

<figure><img src="/files/7aee53615d27ece1ed4d78d86c0724dc885c82bf" alt="" width="563"><figcaption></figcaption></figure>

El **Calculadora** también admite restar fechas y horas sin conversión de tipo. Por ejemplo:

`'11.12.2021' - '8.12.2021' devuelve 3 (días)`

`'11:12' - '3:45' devuelve 447 (minutos)`

</details>

### Cómo averiguar el próximo cumpleaños &#x20;

<details>

<summary>Descripción</summary>

Para que el bot envíe felicitaciones de cumpleaños, puedes usar la función:

**birthdate(date)** - devuelve el próximo cumpleaños a partir de la fecha de nacimiento de la persona: `reminder = birthdate('28.04.1994')`&#x20;

</details>

### Cómo obtener la fecha de un día específico de la semana

<details>

<summary>Descripción</summary>

Si tienes envíos recurrentes en días específicos de la semana, puedes obtener la fecha de un día de la semana para programar el envío.

**weekday\_date(weekday, b)** - devuelve la fecha del día de la semana especificado más cercano. Toma **dos parámetros**:

**El primer parámetro es el** número del día de la semana a buscar (de 1 a 7, donde 1 = lunes, 7 = domingo).

**El segundo parámetro** indica si **devolver la fecha de hoy si el día de la semana especificado es hoy**. Este parámetro es opcional y su valor predeterminado es False.

Veamos un ejemplo para entender cómo funciona el segundo parámetro:

Quieres programar un mensaje para que se envíe el jueves.

¿Pero qué pasa si el cliente se registró justamente un jueves?

¿Debe enviarse el mensaje este jueves o el siguiente?

El segundo parámetro establecido en False significa que el mensaje se enviará solo el próximo jueves (omitiendo hoy).

El segundo parámetro establecido en True significa que el mensaje se enviará este jueves, si hoy es jueves (incluyendo el día de registro).

En nuestro ejemplo, el usuario se registra el jueves, 13.02.2025, y queremos enviar el mensaje el próximo jueves.&#x20;Por lo tanto, el valor devuelto será "20.02.2025".

Por ejemplo, `weekday_date(4)` devolverá '20.02.2025'.

Si quieres que el día actual cuente solo hasta cierta hora, puedes usar esta construcción:

`weekday_date(4, current_time < '13:00')`, donde la condición puede reemplazarse por cualquier condición que necesites.

<mark style="color:verde;">**Aquí tienes un ejemplo de cómo usar la función:**</mark>

Ejemplo de uso de la función en el campo "Fecha de envío" de una conexión

<div data-with-frame="true"><figure><img src="/files/76df6d248fa5f18ce63ec43412fb4ab037caca22" alt="" width="563"><figcaption></figcaption></figure></div>

</details>

### Cómo obtener la fecha de un día específico del mes

<details>

<summary>Descripción</summary>

Si tienes acciones recurrentes en un día específico del mes, puedes obtener la fecha de la ocurrencia más cercana de ese día para programar tu envío.

**month\_date(date, b)** - devuelve la fecha más cercana del mes para el número de día especificado. Toma **dos parámetros**:

**date** - número de día del mes a buscar (de 1 a 31)

**b** - parámetro opcional; indica si debe devolver la fecha de hoy si coincide con el día especificado. El valor predeterminado es False.

Si pasas 31 pero el mes actual solo tiene 30 días, la función devolverá el último día del mes (por ejemplo, el 30).

Por ejemplo:

Si hoy es 05.04.2022 y llamas a t = month\_date(1), el resultado será 01.05.2022, el 1.º del mes más cercano después de hoy.

</details>

### Cómo comprobar si la hora actual está dentro del horario laboral

<details>

<summary>Descripción</summary>

Por ejemplo, la empresa trabaja de 9:00 a. m. a 6:00 p. m. y cierra los sábados y domingos. Vamos a construir las comprobaciones paso a paso:

1. Comprueba si la hora está dentro del horario laboral: current\_time >= '9:00' **Y** current\_time <= '18:00'&#x20;
2. Comprueba si la hora está fuera del horario laboral: current\_time < '9:00' **O** current\_time > '18:00'
3. Comprueba si hoy es un día laborable (no sábado ni domingo): weekday != 6 AND weekday != 7
4. Combina condiciones para escribir durante el horario laboral: current\_time >= '9:00' **Y** current\_time <= '18:00' **Y** weekday != 6 **Y** weekday != 7
5. Combina condiciones para escribir fuera del horario laboral: current\_time < '9:00' **O** current\_time > '18:00' **O** weekday == 6 **O** weekday == 7

</details>

<details>

<summary>Ejemplo</summary>

<div data-with-frame="true"><figure><img src="/files/3ffdd7901954f73cce05f0a145b8c94eab0c72ef" alt=""><figcaption></figcaption></figure></div>

</details>

### Cómo convertir fecha y hora

<details>

<summary>Ejemplo</summary>

El formato de fecha y hora utilizado varía entre sistemas, y es posible que uno de los recursos integrados devuelva una hora en un formato que MaviBot no reconozca. Tendrás que convertirlo.&#x20;

**convert\_datetime(date, fin, f\_out) -** convierte fecha y hora

Hay tres parámetros:

* Cadena de fecha de entrada
* Cadena de formato de entrada
* Cadena de formato de salida

Ejemplo: \
`convert_datetime("2011-11-03", "%Y-%m-%d", "%Y/%m/%d") en la salida será 2011/11/03`

Esta función convierte la fecha de entrada en un **timestamp**.

\#{current\_date} #{current\_time} - convierte a "06.01.2025 11:45" — como no hay información sobre segundos ni microsegundos, la marca de tiempo resultante tiene ceros después del punto decimal.

Por ejemplo: 1736144700.000000

Si incluyes milisegundos después del punto decimal,

`convert_datetime("06.01.2025 19:26:35.123456", "%d.%m.%Y %H:%M:%S.%f", "%s.%f")`

el resultado será: `1736166395.123456`

**get\_datetime(format)** - una función para obtener la hora actual en un formato específico.\
La función toma un parámetro: una cadena que especifica el formato de salida deseado.

{% hint style="info" %} <mark style="color:$primary;">¡Importante!</mark> La respuesta de la función será (lunes, martes, etc.).\
\
Ejemplo: <mark style="color:naranja;">get\_datetime("%A") la salida será miércoles</mark>
{% endhint %}

Descripción de los parámetros de la cadena de formato, que se especifican en la función como cadenas entre comillas:

<table data-header-hidden><thead><tr><th width="177.33333333333331">Directiva</th><th>Valor</th><th>Ejemplo</th></tr></thead><tbody><tr><td><code>%a</code></td><td>Nombre corto del día de la semana</td><td>Dom, Lun ...</td></tr><tr><td><code>%A</code></td><td>Nombre completo del día de la semana</td><td>Lunes, martes, …, domingo </td></tr><tr><td><code>%w</code></td><td>Día de la semana como número decimal, donde 0 es domingo y 6 es sábado</td><td>0, 1, …, 6</td></tr><tr><td><code>%d</code></td><td>Día del mes como número decimal con ceros a la izquierda</td><td>01, 02, …, 31</td></tr><tr><td><code>%b</code></td><td>Nombre corto del mes</td><td>Ene, Feb, …, Dic</td></tr><tr><td><code>%B</code></td><td>Nombre completo del mes</td><td>Enero, febrero, marzo, etc.</td></tr><tr><td><code>%m</code></td><td>Mes como número decimal con ceros a la izquierda</td><td>01, 02, …, 12</td></tr><tr><td><code>%y</code></td><td>Año como número de dos dígitos</td><td>00, 01, …, 99</td></tr><tr><td><code>%Y</code></td><td>Año como número de cuatro dígitos</td><td>0001, 0002, …, 2013, 2014, …, 9998, 9999</td></tr><tr><td><code>%H</code></td><td>Hora (reloj de 24 horas) como número de dos dígitos con ceros a la izquierda</td><td>00, 01, …, 23</td></tr><tr><td><code>%I</code></td><td>Hora (reloj de 12 horas) como número de dos dígitos con ceros a la izquierda</td><td>01, 02, …, 12</td></tr><tr><td><code>%p</code></td><td>Indicador AM o PM</td><td>AM, PM (en_US);am, pm (de_DE)</td></tr><tr><td><code>%M</code></td><td>Minutos como número de dos dígitos con ceros a la izquierda</td><td>00, 01, …, 59</td></tr><tr><td><code>%S</code></td><td>Segundos como número de dos dígitos con ceros a la izquierda</td><td>00, 01, …, 59</td></tr><tr><td><code>%f</code></td><td>Microsegundos como número de seis dígitos con ceros a la izquierda</td><td>000000, 000001, …, 999999</td></tr><tr><td><code>%z</code></td><td>Desplazamiento UTC en la forma <code>±HHMM[SS[.ffffff]]</code> (cadena vacía si el objeto no tiene zona horaria).</td><td>(vacío), +0000, -0400, +1030, +063415, -030712.345216</td></tr><tr><td><code>%Z</code></td><td>Nombre de la zona horaria (cadena vacía si el objeto no tiene zona horaria).</td><td>(vacío), UTC, GMT</td></tr><tr><td><code>%j</code></td><td>Día del año como número de tres dígitos con ceros a la izquierda</td><td>001, 002, …, 366</td></tr><tr><td><code>%U</code></td><td>Número de semana del año (con domingo como primer día de la semana) como número decimal con ceros a la izquierda. Todos los días del nuevo año anteriores al primer domingo se consideran semana cero.</td><td>00, 01, …, 53</td></tr><tr><td><code>%W</code></td><td>Número de semana del año (con lunes como primer día de la semana) como número decimal. Todos los días del nuevo año anteriores al primer lunes se consideran semana cero.</td><td>00, 01, …, 53</td></tr><tr><td><code>%%</code></td><td>Símbolo <code>'%'</code></td><td>%</td></tr><tr><td><code>%s</code></td><td>timestamp</td><td>1607926200</td></tr></tbody></table>

Todos los demás símbolos representan a sí mismos.

{% hint style="info" %}
Puedes obtener la marca de tiempo actual usando: **convert\_datetime("#{current\_date} #{current\_time}", "%d.%m.%Y %H:%M", "%s")**
{% endhint %}

</details>

### Mostrar la fecha actual en formato "dd nombre del mes"

<details>

<summary>Ejemplo</summary>

Para mostrar la fecha en formato "dd nombre del mes", usa la función ***current\_date\_eng()***.&#x20;

*Si necesitas añadir un cierto número de días a esta fecha, debes especificar el número requerido de días como parámetro en la función.*

Por ejemplo, si la fecha de hoy es 3 de abril, entonces la función devolverá:

current\_date\_eng() - 3 de abril

current\_date\_eng(2) - 5 de abril

current\_date\_eng(-2) - 1 de abril

</details>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.mavibot.ai/doc/es/chatbot/functions/calculadora/date.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
