Convierta la fecha OLE (en segundos) a DD.MM.YYYY HH:MM:SS (secuencias de comandos)Hola comunidad JMP,
Hoy tengo un reto especial:
En JMP tengo entradas numéricas (presumiblemente OLE, configuración regional alemana, en segundos). Sé los valores correctos correspondientes en EXCEL, por ejemplo
JMP EXCEL
43717,479872 09.09.2019 11:31:01
43717,479902 09.09.2019 11:31:04
43717,479884 09.09.2019 11:31:02
¿Podría mostrarme una forma JSL de cómo convertir estas entradas JMP (en segundos) en el formato de fecha y hora deseado como se muestra en la columna EXCEL? Intenté varios enfoques pero no pude resolverlo.
¡Muchas gracias!
Re: Convertir fecha OLE (en segundos) a DD.MM.YYYY HH:MM:SS (secuencias de comandos)Gracias @jthi para el video de Tom Scott: Perfecto.
Hay algo en la lista de deseos: https://community.jmp.com/t5/JMP-Wish-List/Time-Zone-Conversion/idi-p/484479
Tal vez esto nos ayude algún día.
saludos cristian
Re: Convertir fecha OLE (en segundos) a DD.MM.YYYY HH:MM:SS (secuencias de comandos)Verificar las zonas horarias generalmente es muy, muy complicado y propenso a errores. El problema con el tiempo y las zonas horarias - Computerphile (youtube.com) . Que yo sepa, no hay una función integrada en JMP para verificar la zona horaria actual.
Puede haber comandos de powershell/línea de comandos para obtener la zona horaria del sistema operativo y comprobar el horario de verano. Después de eso, podría usar Run Command() para ejecutar esos comandos y analizar el desplazamiento correcto y agregarlo a la fecha y hora de JMP.
Re: Convertir fecha OLE (en segundos) a DD.MM.YYYY HH:MM:SS (secuencias de comandos)Hola @Novato2Jumpie ,
de hecho, esto solo es cierto para las marcas de tiempo de verano. En invierno, las marcas de tiempo que crea son -1 hora atrás.
Tengo exactamente el mismo problema que usted y obtengo datos de un saldo en una hoja de cálculo de Excel en el formato de tiempo OLE.
Estaba frustrado porque todos mis datos parecían cambiar 1 hora en los meses de invierno.
@txnelson ¿Hay alguna manera (¿función JSL incorporada tal vez?) de verificar si una marca de tiempo es en verano o en invierno y luego sumar/restar una hora?
Obviamente, hay muchos países en el mundo que tienen esta característica en su sistema: https://www.timeanddate.com/time/dst/2022.html
así que no debería ser un problema solo en Alemania o Suiza, donde estoy.
Se puede verificar si la marca de tiempo es anterior al último domingo de marzo a las 2:00 a. m. o posterior al último domingo de octubre a las 3:00 a. m., pero esto es un poco complicado, ¿no?
Atentamente,
cristiano
Re: Convertir fecha OLE (en segundos) a DD.MM.YYYY HH:MM:SS (secuencias de comandos)Mi solución:
Enfoque de formato Tx':
format(in days(43717)-in days(1)-in years(4) + .479872*indays(1),"m/d/yh:m:s");
Mi enfoque de cálculo (supone que la cadena de tiempo OLE es un carácter y
información relevante extraída en campos de utilidad, sin corrección tipográfica):
nueva columna ("Mi_OLE", numérico, "continuo", fórmula (formato (en
días(:"OLE_días"-en días(1)-en años(:"OLE_años") +
:"OLE_hhmmss"*indays(1),"d/m/yh:m:s"))) ;
Re: Convertir fecha OLE (en segundos) a DD.MM.YYYY HH:MM:SS (secuencias de comandos)@Novato2Jumpie
Tienes razón...Tomé el enfoque equivocado al tratar de resolver el problema.Los valores de fecha que tiene son en realidad valores de fecha/hora de Excel.Se basan en el número de días desde el 01JAN1900, (43717) , por los días, y una proporción de un día, ( .479884 ), para la hora y comienzan con el día 1. La base JMP es la cantidad de segundos desde el 01JAN1904 y comienza el día 0. Entonces, la fórmula de conversión es:
in days(43717)-in days(1)-in years(4) + .479872*indays(1)
Esto se puede mostrar en el siguiente JSL
format(in days(43717)-in days(1)-in years(4) + .479872*indays(1),"m/d/y h:m:s");
format(in days(43717)-in days(1)-in years(4) + .479902*indays(1),"m/d/y h:m:s");
format(in days(43717)-in days(1)-in years(4) + .479884*indays(1),"m/d/y h:m:s");
format(in days(43717)-in days(1)-in years(4) + .479872*indays(1),"m/d/y h:m:s")
/*:
"09/09/2019 11:31:01 AM"
//:*/
format(in days(43717)-in days(1)-in years(4) + .479902*indays(1),"m/d/y h:m:s");
/*:
"09/09/2019 11:31:04 AM"
//:*/
format(in days(43717)-in days(1)-in years(4) + .479884*indays(1),"m/d/y h:m:s");
/*:
"09/09/2019 11:31:02 AM"
Re: Convertir fecha OLE (en segundos) a DD.MM.YYYY HH:MM:SS (secuencias de comandos)El fondo es que se trata de un valor especial de fecha y hora basado en OLE. tan lejos como yo estaba
dijo que parece ser segundos después de 1900. EXCEL importa estos valores
correctamente (valores de muestra a la derecha). JMP no.
Simplifiquemos:
No me importa si el formato de visualización final de JMP es EE. UU., internacional,
o europeo. Lo más importante es una conversión de trabajo a una más
formato de fecha y hora JMP legible/común. La columna EXCEL muestra lo que
debería verse el resultado correcto.
Por cierto, los dos enfoques no funcionan correctamente. Ambos establecen todas las entradas en
09.09.2019 11:31:01.
Re: Convertir fecha OLE (en segundos) a DD.MM.YYYY HH:MM:SS (secuencias de comandos)¿Podría proporcionar más información sobre los valores de JMP en segundos?Si aplico la idea de Jim, los tres valores son iguales.
jmp_list = {43717.479872, 43717.479902, 43717.479884};
excel_list = {};
for (i = 1, i <= nitems(jmp_list), i++,
one_dt = jmp_list[i];
// Add the number of seconds different from the JMPValue to the
// JMP date time value for 09.09.2019 11:31:01
jmp_dt = one_dt + 3650829743.52013;
// Display its value using a standard JMP format
dtc = Format( jmp_dt, "d/m/y h:m:s" ) ;
dtc = substitute(dtc, "/", ".");
excel_list[i] = dtc;
);
show(excel_list);
excel_list = {"09.09.2019 11:31:01 AM", "09.09.2019 11:31:01 AM", "09.09.2019 11:31:01 AM"};
Las dos primeras entradas tienen una diferencia de 3 segundos, pero los números tienen una diferencia de 0,000030
La primera y la tercera entrada están separadas por 1 segundo, pero los números están separados por .000012.
¿Cuáles son las unidades de la columna "Valores JMP en segundos"?
Re: Convertir fecha OLE (en segundos) a DD.MM.YYYY HH:MM:SS (secuencias de comandos)I No sé si esto ayudará en absoluto, pero aquí hay una forma bruta de hacer la conversión.Tenga en cuenta que la configuración inicial del valor de fecha JMP está en la estructura numérica de EE. UU.
Names Default To Here( 1 );
JMPValue = 43717.479872;
// Add the number of seconds different from the JMPValue to the
// JMP date time value for 09.09.2019 11:31:01
JMPDateTime = JMPValue + 3650829743.52013;
// Display it's value using a standard JMP format
Show( Format( JMPDateTime, "d/m/y h:m:s" ) );
// Now show the same JMPDateTime but using a Custom
// format to change the value into exactly the desired
// structure
Show(
Format(
JMPDateTime,
"Custom",
Formula(
Trim( Substr( " 0", -1 * Length( Char( Day( value ) ) ), 1) ) || Char( Day( value ) )
|| "." ||
Trim( Substr( " 0", -1 * Length( Char( Month( value ) ) ), 1) ) || Char( Month( value ) )
|| "." ||
Char( Year( value ) )
|| " " ||
Trim( Substr( " 0", -1 * Length( Char( Hour( value ) ) ), 1) ) || Char( Hour( value ) )
|| ":" ||
Trim( Substr( " 0", -1 * Length( Char( Minute( value ) ) ), 1) ) || Char( Minute( value ) )
|| ":" ||
Trim( Substr( " 0", -1 * Length( Char( Floor( Second( value ) ) ) ), 1) ) || Char( Floor( Second( value ) ) )
),
40
)
);
Lo que da los resultados
Format(JMPDateTime, "d/m/y h:m:s") = "09/09/2019 11:31:01 AM";
Format(JMPDateTime, "Custom", Formula(Trim(Substr(" 0", -1 * Length(Char(Day(value))), 1)) || Char(Day(value)) || "." || Trim(Substr(" 0", -1 * Length(Char(Month(value))), 1)) || Char(Month(value)) || "." || Char(Year(value)) || " " || Trim(Substr(" 0", -1 * Length(Char(Hour(value))), 1)) || Char(Hour(value)) || ":" || Trim(Substr(" 0", -1 * Length(Char(Minute(value))), 1)) || Char(Minute(value)) || ":" || Trim(Substr(" 0", -1 * Length(Char(Floor(Second(value)))), 1)) || Char(Floor(Second(value)))), 40) = "09.09.2019 11:31:01";