Velneo 35 y manejo de fechas en nuevo motor de JavaScript

Primero, creo que sería prudente no pasarse a la versión 35 de Velneo, ya que con el nuevo motor de JavaScript muchas cosas se han descompuesto (ya me han pasado varias, afortunadamente no son en proceso críticos, por eso no me saltaron en mi revisión).

Tengo una variable global en memoria del tipo Fecha llamada TC_DATE.
Desde un formulario, desde un evento, a esta variable le asigno el valor del campo de la tabla en edición, el campo es de tipo Fecha.
También aparte tengo un proceso con el que asigno a esta misma variable con la función currentDate().
Desde cualquiera de estos lugares, siempre estoy seguro de que lo que tengo es una fecha “plana”.
En cualquiera de ambos casos, ya una vez asignada la variable TC_DATE, mando llamar un proceso en JavaScript en donde tengo el siguiente código:

var fecha = theApp.globalVarToDate(“Recicla_dat/TC_DATE”);

Para depurar ahora tuve que hacerlo con el viejo y confiable “alert” y revisar el valor en la variable fecha.
Suponiendo que a TC_DATE le asigno la fecha de hoy 21/06/2024 (por cualquiera de los métodos arriba descritos), el resultado que me arroja el alert es:
jue. jun. 20 18:00:00 2024 GMT -0600
{meme con cara de “ehhh!!!???”}

  1. Se supone que estoy trabajando solo con fechas y no con fecha/hora
  2. globalVarToDate me debería de regresar también una fecha plana y lo que hace es interpretar que la variable TC_DATE es UTC y “me hace el favor” de convertirla a GMT -0600 restando 6 horas a la fecha (por eso las 18:00:00), provocando con esto que en adelante comience a trabajar con la fecha “20/06/2024” y todos mis cálculos se vayan al diablo.

¿Algún alma caritativa (cajum paco satue cajum) que me apoye a resolver este entuerto?
Estoy buscando funciones para “corregir” este problema, pero al momento no encuentro algo que me ayude.

Saludos!

Hola marco_rangel.

Solo tienes que recordar que en JavaScript solo existe el el objeto Fecha/Hora que equivale al tipo nativo Tiempo de Velneo.

Las funciones *ToDate() y *ToTime() que se aplican a las variables locales, variables globales y a los campos de las tablas solo crean confusión porque en JavaScript no existen los datos de tipo Fecha u Hora de Velneo nativo.

La solución pasa por varias opciones que cada programador deberá evaluar:

  • No usar nunca los tipos Fecha y Hora de Velneo. Usar exclusivamente el tipo Tiempo que guarda información del UTC y es compatible con el dato Fecha/Hora del JavaScript del API.
  • Si se van a usar los tipos Fecha y Hora de Velneo establecer un sistema de intercambio entre la aplicación nativa y el API de Velneo. Por ejemplo pasar las Fechas y las Horas como un string.

Saludos
Paco Satué

Santo cielo!!! esto llevará a revisar un montón de cosas en la aplicación.
Muchas gracias por las anotaciones Paco.
Mientras para solucionar donde me saltó usé el siguiente código, por si alguien le interesa:

var fecha = theApp.globalVarToDate(“Recicla_dat/TC_DATE”);
var fechaUTC = new Date(fecha.getTime() + fecha.getTimezoneOffset() * 60000);
fecha = fechaUTC;

La primera línea era la que ya tenía (y dejó de funcionar). Sé que me puedo ahorrar la tercer línea, pero lo tenía así cuando estaba haciendo las pruebas y estaba comparando los valores de fecha y fechaUTC y así lo dejé finalmente.
Pues tocará revisar entonces un montón de código

O no lo capto o no lo veo.
Me explico:
En mi servidor version 34.1
Tengo un proceso “A” en js que recupera una variable tipo fecha (inicializada desde velneo con currendate()) que le pasa otro proceso “B”. Hoy es 26/06/2024 hora 09:XX:XX
El proceso “A”:
var fecha = theRoot.varToDate(“FECHA_SOLO”);
alert(fecha);
Me devuelve: Wed Jun 26 2024 00:00:00 GMT+0200 (Hora de ver. Europa Occidental)

Por lo cual esto no es de la version 35, ya pasa en la 34
Si al proceso “B” le añado
var fechaUTC = new Date(fecha.getTime() + fecha.getTimezoneOffset() * 60000);
fecha = fechaUTC;
alert(fecha);
Me devuelve: Tue Jun 25 2024 22:00:00 GMT+0200 (Hora de ver. Europa Occidental) ¡¡INCORRECTO en mi servidor!!
La verdad es que trabajar con fechas siempre es muy lioso, sea el lenguaje de programación que sea
Voy a probar en la version 35.1…

Version 35.1, a las 10:01 :
var fecha = theRoot.varToDate(“FECHA_SOLO”);
mi. jun. 26 02:00:00 2024 GMT+0200

Con
var fechaUTC = new Date(fecha.getTime() + fecha.getTimezoneOffset() * 60000);
fecha = fechaUTC;

Devuelve
mi. jun. 26 00:00:00 2024 GMT+0200
¡¡Correcto tu planteamiento marco_angel!!

Nada, me toca revisar código ( quisieramos pasar este fin de semana a la 35.1)

1 me gusta

Hola emilianorubio.

Efectivamente, es un problema de siempre con Velneo, desde que se añadió el API y no se tuvo en cuenta que en JavaScript no hay datos de tipo Fecha ni de Hora.

Ya había problemas hace años con el paso de variables desde Velneo al API.
Fechas en formato ISO y hora UTC - Velneo - Velneo

Las fechas deben guardarse siempre con la Hora UTC y eso Velneo lo hace correctamente.
El problema surge con las variables Fecha que no tienen la Hora asignada y lo que hace el API es suponer que son las 00:00 horas UTC.

La solución de marco_rangel es otra de las chapuzillas a que nos obliga Velneo para resolver este tipo de cuestiones: sumar/restar a la Fecha obtenida en el API el Offset de la Hora de la Zona Horaria local.

Quizás la solución pasaría por modificar la función varToDate() para que no haga conversión de la Zona Horaria y tome siempre las 00:00 horas local.

Tenéis la aplicación del cloud 0PS_MiAPI con un ejemplo de paso de variables Fecha/Hora/Tiempo.

Saludos
Paco Satué

1 me gusta