Converti la data OLE (in secondi) in GG.MM.AAAA HH:MM:SS (scripting)Salve comunità JMP,
Oggi ho una sfida speciale:
In JMP ho voci numeriche (presumibilmente OLE, locale tedesco, in secondi). Conosco i corrispondenti valori corretti in EXCEL, ad es
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
Potresti mostrarmi un modo JSL come convertire queste voci JMP (in secondi) nel formato datetime desiderato come mostrato nella colonna EXCEL? Ho provato diversi approcci ma non sono riuscito a capirlo.
Grazie mille!
Oggetto: Converti data OLE (in secondi) in GG.MM.AAAA HH:MM:SS (scripting)Grazie @jthi per il video di Tom Scott: perfetto.
C'è qualcosa nella lista dei desideri: https://community.jmp.com/t5/JMP-Wish-List/Time-Zone-Conversion/idi-p/484479
Forse questo ci aiuterà un giorno.
Un saluto, Cristiano
Oggetto: Converti data OLE (in secondi) in GG.MM.AAAA HH:MM:SS (scripting)Il controllo dei fusi orari in genere è molto complicato e soggetto a errori Il problema con l'ora e i fusi orari - Computerphile (youtube.com) . A mia conoscenza, non esiste alcuna funzione integrata in JMP per verificare il fuso orario corrente.
Potrebbero esserci comandi powershell/riga di comando per ottenere il fuso orario dei sistemi operativi e controllare l'ora legale. Successivamente è possibile utilizzare Run Command() per eseguire quei comandi e analizzare l'offset corretto e aggiungerlo al datetime di JMP.
Oggetto: Converti data OLE (in secondi) in GG.MM.AAAA HH:MM:SS (scripting)CIAO @Newbie2Jumpie ,
in realtà questo è vero solo per i timestamp dell'ora legale. In inverno i timestamp che crei sono indietro di -1 ora.
Ho lo stesso identico problema come te e sto ottenendo dati da un saldo a un foglio di calcolo Excel nel formato orario OLE.
Ero frustrato perché tutti i miei dati sembravano essere spostati di 1 ora nei mesi invernali.
@txnelson C'è un modo (forse la funzione JSL integrata?) Per verificare se un timestamp è in estate o in inverno e quindi aggiungere/sottrarre un'ora?
Ovviamente ci sono molti paesi nel mondo che hanno questa caratteristica nel loro sistema: https://www.timeanddate.com/time/dst/2022.html
quindi non dovrebbe essere un problema solo in Germania o in Svizzera, dove mi trovo.
Si può controllare se il timestamp è prima dell'ultima domenica di marzo alle 2:00 o dopo l'ultima domenica di ottobre alle 3:00, ma questo è piuttosto complicato, non è vero?
Distinti saluti,
cristiano
Oggetto: Converti data OLE (in secondi) in GG.MM.AAAA HH:MM:SS (scripting)La mia soluzione:
Approccio al formato Tx:
format(in giorni(43717)-in giorni(1)-in anni(4) + .479872*ingiorni(1),"m/g/aa:m:s");
Il mio approccio al calcolo (presuppone che la stringa temporale OLE sia carattere e
informazioni pertinenti estratte nei campi di utilità, senza errori di battitura):
new column("My_OLE",numeric,"continuous",formula(format(in
giorni(:"OLE_giorni"-in giorni(1)-in anni(:"OLE_anni") +
:"OLE_hhmmss"*indays(1),"g/m/aa:m:s"))) ;
Oggetto: Converti data OLE (in secondi) in GG.MM.AAAA HH:MM:SS (scripting)@Newbie2Jumpie
Hai ragione ...... ho adottato l'approccio sbagliato nel tentativo di risolvere il problema.I valori di data che hai sono in realtà valori di data/ora di Excel.Si basano sul numero di giorni dal 01JAN1900, (43717) , per i giorni, e una proporzione di un giorno, ( .479884 ), per l'ora e iniziano con il giorno 1. La base JMP è il numero di secondi dal 01JAN1904 e inizia dal giorno 0. Quindi la formula di conversione è:
in days(43717)-in days(1)-in years(4) + .479872*indays(1)
Questo può essere visualizzato nel seguente 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"
Oggetto: Converti data OLE (in secondi) in GG.MM.AAAA HH:MM:SS (scripting)Lo sfondo è, questo è uno speciale valore datetime basato su OLE. Per quanto ero lontano
detto che sembra essere secondi dopo il 1900. EXCEL importa questi valori
correttamente (valori di esempio a destra). JMP no.
Semplifichiamo semplicemente:
Non mi importa se l'eventuale formato di visualizzazione di JMP è USA, internazionale,
o europeo. La cosa più importante è una conversione funzionante in più
formato data/ora JMP leggibile/comune. La colonna EXCEL mostra cosa
dovrebbe apparire il risultato corretto.
A proposito, i due approcci non funzionano correttamente. Entrambi impostano tutte le voci su
09.09.2019 11:31:01.
Oggetto: Converti data OLE (in secondi) in GG.MM.AAAA HH:MM:SS (scripting)Potresti fornire maggiori informazioni sui valori JMP in pochi secondi?Se applico l'idea di Jim, tutti e tre i valori sono uguali.
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"};
Le prime due voci sono separate di 3 secondi, ma i numeri sono separati da .000030
La prima e la terza voce sono separate da 1 secondo, ma i numeri sono separati da .000012.
Quali sono le unità della colonna "Valori JMP in secondi"?
Oggetto: Converti data OLE (in secondi) in GG.MM.AAAA HH:MM:SS (scripting)IO non so se questo aiuterà affatto, ma ecco un modo brut force per eseguire la conversione.Si noti che l'impostazione iniziale del valore della data JMP è nella struttura numerica US
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
)
);
Che produce i risultati
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";