Si en el anterior artículo vimos las fechas con AutoHotkey, en este veremos las horas, con casos prácticos para que veas las posibilidades.
Con AutoHotkey podemos manejar las fechas y horas de una forma que nos puede ser muy útil en tareas que no están directamente relacionadas con el proceso de traducción, pero que requieren tu tiempo, tu atención y tus energías.
Quiero decir, que si espabilas antes esas tareas que no son traducción propiamente dicha, podrás dedicar más tiempo a traducir, o hacerlo con más energía, o terminar antes de trabajar y tener más tiempo para ti mismo.
Las fechas y horas con AutoHotkey
Podremos aprovechar gran parte de las funciones de AutoHotkey con estas líneas:
;-------------------------------- ; AUTOHOTKEY Y LAS FECHAS/HORAS ; Inicio de macro de AutoHotkey ;-------------------------------- FormatTime, día, , d FormatTime, día2, , dd FormatTime, díaSemana, , WDay FormatTime, mes, , MM FormatTime, mesCompleto, , MMMM FormatTime, año, , yyyy FormatTime, hora, , H FormatTime, hora2, , HH FormatTime, minuto, , m FormatTime, minuto2, , mm FormatTime, segundo, , s FormatTime, segundo2, , ss
En estas primeras líneas empleamos la función FormatTime para asignar la fecha y hora actuales, en el momento en que se ejecuta la macro de AutoHotkey, a ciertas variables: hora, hora2, minuto, segundo, etc.
Por ejemplo, si ejecutas la macro el 9 de mayo de 2015, a las 8 horas, 9 minutos y 10 segundos de la mañana, estas variables tendrán los siguientes valores:
| Variable | Valor |
| día2 | 09 (con cero inicial para completar 2 cifras) |
| díaSemana | 6 (el día 1 es el domingo; 2 es lunes…) |
| mes | 05 (con cero inicial para completar 2 cifras) |
| mesCompleto | mayo |
| año | 2015 |
| hora | 8 |
| hora2 | 08 (con cero inicial para completar 2 cifras) |
| minuto | 9 |
| minuto2 | 09 (con cero inicial para completar 2 cifras) |
| segundo | 10 |
| segundo2 | 10 (cero inicial innecesario) |
Pues bien, vamos a aprovechar estos valores para hacer tareas que nos pueden interesar.
Ya hablamos en el artículo anterior que AutoHotkey es muy útil para crear plantillas de correo electrónico. Piensa en la variedad de correos que envías cada día con un texto que casi siempre es el mismo:
- para confirmar al cliente que has recibido un documento que vas a traducir;
- para enviar un presupuesto al cliente;
- para enviar el documento traducido al cliente;
- para enviar tu factura al cliente.
Seguramente se te ocurre alguno más, ¿verdad?
Pues bien, puedes usar las funciones de horas de AutoHotkey, para personalizar un poco tus mensajes.
Por ejemplo, si cuando envías una factura escribes un mensaje más o menos así:
Hola, XX: Adjunto la factura correspondiente a esta traducción. ¿Me puedes confirmar que la has recibido correctamente? Gracias.
donde XX es el nombre de pila de tu cliente, ya sabes que con AutoHotkey puedes escribir todo eso con una abreviatura.
Por ejemplo:
:*:hxxfac1::
SendInput Hola, XX:{Enter}{Enter}Adjunto la factura correspondiente a esta traducción.{Enter}{Enter}¿Me puedes confirmar que la has recibido correctamente?{Enter}{Enter}Gracias.
return
Al escribir hxxfac1, se escribirá todo el texto que ves, tanto si estás escribiendo tu correo desde un programa como Outlook como si consultas y respondiendo tu correo desde tu navegador web (web mail).
Solo tendrías que escribir el nombre de pila en la plantilla.
Esto no es nuevo, ya lo vimos en este artículo del blog, pero ahora vamos a ver cómo puedes variar el saludo «Hola» para que sea «Buenos días» o «Buenas tardes» en función de la hora en la que envías tu correo electrónico.
Por ejemplo, si quieres que la macro escriba «Buenos días» desde las 7 hasta las 12 horas, «Buenas tardes» de 15 a 19 horas, y el resto, que diga un «Hola» neutro, la macro de AutoHotkey sería así:
; Mensaje de envío de factura
; con texto variable en función de la hora
:*:hxxfac2::
; Miramos la hora actual
FormatTime, Hora, , H
; por la mañana: de 7:00 a 11:59
if (Hora = 7 or Hora = 8 or Hora = 9 or Hora = 10 or Hora = 11)
cadena1 = Buenos días
; por la tarde: de 15:00 a 18:59
else if (Hora = 15 or Hora = 16 or Hora = 17 or Hora = 18)
cadena1 = Buenas tardes
; el resto de horas
else
cadena1 = Hola
cadenaFinal = , XX:{Enter}{Enter}Adjunto la factura correspondiente a esta traducción.{Enter}{Enter}¿Me puedes confirmar que la has recibido correctamente?{Enter}{Enter}Gracias.
SendInput %cadena1%%cadenafinal%
return
Aquí puedes ver que la variable cadena1 (líneas 55 y 59) toma un valor u otro dependiendo de la hora justa a la que escribes la abreviatura hxxfac2 (supondremos que es la misma que la de envío).
Por supuesto, tienes que tener cuidado y no enviar el correo con «XX», quedarías algo mal con tu cliente…
En otro artículo te enseñaré como puedes escribir automáticamente el nombre del destinatario de tu correo, sin este peligroso «XX».
* * * * *
Un inciso técnico, que te puedes saltar: admito que la línea 54:
if (Hora = 7 or Hora = 8 or Hora = 9 or Hora = 10 or Hora = 11)
quedaría mucho más sencilla así: if (Hora >= 7 and Hora <=11)
Pero el plugin de WordPress que me colorea el código lo hace mal y me inserta puntos y comas después de los símbolos > o <.
🙁
Así que, por motivos técnicos, he tenido que dejarlo como ves arriba…
Incisos aparte, seguimos con lo nuestro.
Abreviaturas humanizadas con AutoHotkey
¿Quieres que estas cadenas de texto no sean tan rígidas y que haya algo «humano», un punto aleatorio?
¡También se puede hacer!
Fíjate en este código modificado del anterior:
; Mensaje de envío de factura
; con texto variable en función de la hora
; pero un cierto nivel de aleatoriedad
:*:hxxfac3::
; Miramos la hora actual
FormatTime, Hora, , H
; por la mañana: de 7:00 a 11:59
if (Hora = 7 or Hora = 8 or Hora = 9 or Hora = 10 or Hora = 11)
cadena1 = Buenos días
; por la tarde: de 15:00 a 18:59
else if (Hora = 15 or Hora = 16 or Hora = 17 or Hora = 18)
cadena1 = Buenas tardes
; el resto de horas
else
cadena1 = Hola
cadenaFinal = , XX:{Enter}{Enter}Adjunto la factura correspondiente a esta traducción.{Enter}{Enter}¿Me puedes confirmar que la has recibido correctamente?{Enter}{Enter}Gracias.
; creamos un número aleatorio entre 1 y 3
Random, Aleatorio, 1, 3
; En el 70% de los casos escribirá la cadena
; que corresponda a la hora: Buenos días, Buenas tardes.
; Pero el 30% de las veces escribirá un «Hola» neutro.
if (Aleatorio = 1 or Aleatorio = 2)
SendInput %cadena1%%cadenafinal%
else
SendInput Hola%cadenafinal%
return
Todo este bloque de código es igual que al anterior hasta la línea 66, donde creamos un número aleatorio entre 1 y 3. De esta forma, solo el 66% de las ocasiones se hará mecánicamente (cuando la variable Aleatorio sea 1 o 2, línea 71), y el 33% restante se tendrá un «Hola» neutral (cuando Aleatorio sea igual a 3, línea 74).
Por supuesto, los porcentajes, las horas y las cadenas de texto de este código se pueden cambiar a lo que quieras.
Variables especiales para fechas y horas con AutoHotkey
En todo el código visto hasta ahora, sabíamos el día, mes, año, hora, minuto y segundo gracias a la función FormatTime (por ejemplo, en la línea 52).
Quiero que sepas que hay variables internas de AutoHotkey que nos dan directamente estos valores ,y que si te conviene, puedes emplearlas en lugar de la función FormatTime.
Por ejemplo, el siguiente código nos mostraría la fecha y horas actuales cada vez que pulsemos fyh con el teclado:
;Escribe la fecha y la hora en 2 líneas
:*:fyh::
cadenaFecha = Hoy es: %A_DD%:%A_MMMM%:%A_YYYY%
cadenaHora = Son las: %A_Hour%:%A_Min%:%A_Sec%
Send %cadenaFecha%{Enter}%cadenaHora%
return
Al escribir la abreviatura fyh, tendríamos escrito automáticamente este texto:
Hoy es: 03:mayo:2015 Son las: 14:23:39
Como ves, las variables internas A_DD, A_MMMM y A_YYYY guardan el día, el mes y el año, respectivamente (línea 3); mientras que A_Hour, A_Min y A_Sec hacen lo propio con la hora, los minutos y los segundos (línea 4).
La línea 5 escribe las dos líneas que ves con la fecha y la hora, respectivamente.
Recordamos que en la línea 5, las variables cadenaFecha y cadenaHora van entre signos de porcentaje porque queremos su valor, ¿de acuerdo?
Estas variables tienen su valor actualizado en el momento en que se usan en la macro, así no necesitas la función FormatTime. El punto negativo es que estas variables tienen un nombre un poco raro…
En la Ayuda de AutoHotkey (pulsa F1 en el editor) tienes todas las variables internas de fecha y hora:
| Variable interna | Explicación |
| A_YYYY | Año en 4 cifras. Ejemplo: 2015. |
| A_MM | Mes en 2 cifras. Ejemplo: 05. |
| A_DD | Día en 2 cifras. Ejemplo: 09. |
| A_MMMM | Mes en letras. Ejemplo: mayo. |
| A_MMM | Mes en 3 letras. Ejemplo: may. |
| A_DDDD | Día de la semana en letras. Ejemplo: sábado. |
| A_DDD | Día de la semana en 3 letras. Ejemplo: sáb. |
| A_WDay | Número de día de la semana. Ejemplo: 6 (1 es domingo). |
| A_YDay | Número del día en el año. Un valor entre 1 y 366. |
| A_YWeek | Año + número de la semana. Ejemplo: 201519. |
| A_Hour | Hora en 2 cifras en formato 24 horas. Ejemplo: 13. |
| A_Min | Minutos en 2 cifras. Ejemplo: 08. |
| A_Sec | Segundos en 2 cifras. Ejemplo: 35. |
| A_MSec | Milisegundos en 3 cifras. Ejemplo: 126. |
| A_Now | Hora en formato YYYYMMDDHH24MISS |
| A_NowUTC | Hora UTC en formato YYYYMMDDHH24MISS |
| A_TickCount | Milisegundos desde que se reinició el PC. Ejemplo de A_TickCount en macro: |
HoraInicio := A_TickCount Sleep, 1000 HoraFinal := A_TickCount - HoraInicio MsgBox, Han transcurrido %HoraFinal% milisegundos
Tanto si usas la función FormatTime como si usas las variables internas de fecha y hora, tienes mucho que aprovechar: usa la forma que más cómoda te resulte.
Conclusiones de las horas con AutoHotkey
En este artículo hemos visto aplicaciones de las horas para lanzar textos largos en función de la hora, concretamente en plantillas de correo electrónico.
Te puedo decir que uso personalmente estas plantillas: no es solo que lo escribo el texto más rápido y sin errores, es que no le dedico más que unos pocos segundos a escribir. Son energías que dedico a otras tareas que necesitan mi cien por cien de concentración y que no puedo automatizar.
Ahora es tu turno para ver cómo puedes aprovechar las funciones de horas en AutoHotkey.
Espero haberte dado algunas ideas.
* * * * *
Este artículo se me ha ido de longitud, así que en un próximo artículo aplicaremos las fechas y horas de AutoHotkey de una manera que quizá no te imagines, pero no menos útil para mí: ejecutar programas o abrir documentos al abrir la macro, en función de la fecha y hora…
Así que, atento al blog.
🙂







Muchas gracias por el artículo.
Quiero que un script almacene la hora en la que empieza y un proceso y la hora en la que termina.
He probado con A_Now y con FormatTime, pero ambas dan siempre la hora del momento actual.
Es decir, si por ejemplo hago una variable:
Hora_Inicio = A_Now
Cuando uso esa variable no me pone la hora en la que se guardó, sino la actual (se actualiza continuamente, vaya).
Ocurre lo mismo con el comando FormatTime.
No sé si te ocurre alguna manera de hacer esto (seguro que tiene que ser fácil... cuando se sabe, como todo :-).
Aunque, como te digo, está mal, esto es lo que llevo "discurrido" hasta ahora:
; Guardar la hora de inicio y de finalización de un proceso.#Space::
Hora_Inicio = A_Now ; Guarda la hora en la que empieza
Sleep 10000 ; Espera 10 segundos
Hora_Fin = A_Now ; Guarda la hora en la que finaliza
FormatTime, Hora_Inicio,,dd/MM/yyyy hh:mm:ss ; Aplica el formato deseado a Hora_Inicio
FormatTime, Hora_Fin,,dd/MM/yyyy hh:mm:ss ; Aplica el formato deseado a Hora_Fin
MsgBox, 0, Hora de inicio y de finalización, Inicio: %Hora_Inicio%`nFinalización: %Hora_Fin%
Return
Gracias de nuevo y un saludo.
Hola, Diego:
En las primeras líneas, Hora_Inicio y Hora_Fin tienen el valor correcto.
Pero como después, el segundo parámetro de la función FormatTime está vacío, te devuelve siempre la fecha y hora actuales, no la que de Hora_Inicio y Hora_Fin, que por cierto, son variables de salida, no de entrada.
Saludos.
… Jesús Prieto …
Muchas gracias por tu ayuda... tan rápida 🙂
Cierto, me estaba liando con las variables en FormatTime.
Ahora ya están bien puestas.
Las de entrada he tenido que ponerlas entre %% para que las lea bien.
Aparte, he tenido que definir las variables como expresiones (:=), porque de la forma tradicional no parece que funcione.
He conseguido que funcione así:
#Space::Inicio := A_Now ; Guarda la hora en la que empieza
MsgBox, 0, Inicio, Inicio del proceso`n(Esperar 5 segundos), 5 ; Avisa de que se ha iniciado el proceso y espera 5 seg.
Fin := A_Now ; Guarda la hora en la que termina
FormatTime, Form_Inicio, %Inicio%, hh:mm:ss ; Determina el formato de la hora de inicio.
FormatTime, Form_Fin, %Fin%, hh:mm:ss ; Determina el formato de la hora de finalización.
MsgBox, 0, Inicio y final, %Form_Inicio%`n%Form_Fin% ; Muestra las dos horas.
Return
Me alegro de que encontraras la forma y gracias por poner la forma que te funcionó.
Sí, conviene poner := en vez de =, a veces no funciona si no lo haces así…
Un abrazo.
… Jesús Prieto …
También le he añadido el tiempo transcurrido (00h 00m 00s).
No sé si para esto habrá alguna función específica... Yo lo he hecho un poco por la "cuenta de la vieja", je je, aprovechando el operador Floor divide (//), que devuelve la parte entera de una división.
Lapso := Fin - Inicio ; Guarda el número de segundos transcurridos en la variable Lapso.Min_Entero := Lapso//60 ; Minutos totales.
Segs := Lapso - ((Min_Entero) * 60) ; Segundos reales.
Horas := Min_Entero//60 ; Horas reales
Mins := Min_Entero - (Horas * 60) ; Minutos reales
MsgBox, %Horas%h %Mins%m %Segs%s