OLE-Datum (in Sekunden) in TT.MM.JJJJ HH:MM:SS umwandeln (Scripting)Hallo JMP-Gemeinde,
Heute habe ich eine besondere Herausforderung:
In JMP habe ich numerische Einträge (vermutlich OLE, deutsches Gebietsschema, in Sekunden). Ich kenne die entsprechenden korrekten Werte in EXCEL, zB
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
Könnten Sie mir einen JSL-Weg zeigen, wie ich diese JMP-Einträge (in Sekunden) in das gewünschte Datetime-Format umwandeln kann, wie es in der EXCEL-Spalte gezeigt wird? Ich habe mehrere Ansätze ausprobiert, konnte es aber nicht herausfinden.
Vielen Dank!
Betreff: OLE-Datum (in Sekunden) in TT.MM.JJJJ HH:MM:SS umwandeln (Scripting)Danke @jthi für das Tom Scott Video: Perfekt.
Auf der Wunschliste steht etwas: https://community.jmp.com/t5/JMP-Wish-List/Time-Zone-Conversion/idi-p/484479
Vielleicht hilft uns das eines Tages.
Grüße, Christian
Betreff: OLE-Datum (in Sekunden) in TT.MM.JJJJ HH:MM:SS umwandeln (Scripting)Das Überprüfen von Zeitzonen ist im Allgemeinen sehr, sehr schwierig und fehleranfällig Das Problem mit Zeit & Zeitzonen - Computerphile (youtube.com) . Meines Wissens gibt es in JMP keine eingebaute Funktion, um die aktuelle Zeitzone zu überprüfen.
Möglicherweise gibt es Powershell-/Befehlszeilenbefehle, um die Zeitzone des Betriebssystems abzurufen und nach Sommerzeit zu suchen. Danach könnten Sie Run Command() verwenden, um diese Befehle auszuführen und den korrekten Offset zu parsen und diesen zu Datetime von JMP hinzuzufügen.
Betreff: OLE-Datum (in Sekunden) in TT.MM.JJJJ HH:MM:SS umwandeln (Scripting)Hallo @Neuling2Jumpie ,
Tatsächlich gilt dies nur für Sommerzeit-Zeitstempel. Im Winter liegen die von Ihnen erstellten Zeitstempel -1 Stunde zurück.
Ich habe genau das gleiche Problem wie Sie und bekomme Daten von einer Bilanz in eine Excel-Tabelle im OLE-Zeitformat.
Ich war frustriert, weil alle meine Daten in den Wintermonaten um 1 Stunde verschoben zu sein schienen.
@txnelson Gibt es eine Möglichkeit (vielleicht eingebaute JSL-Funktion?), um zu überprüfen, ob ein Zeitstempel in der Sommer- oder Winterzeit liegt, und dann eine Stunde hinzuzufügen/abzuziehen?
Offensichtlich gibt es viele Länder auf der Welt, die diese Funktion in ihrem System haben: https://www.timeanddate.com/time/dst/2022.html
also sollte es nicht nur ein problem in deutschland oder der schweiz geben, wo ich bin.
Man kann prüfen, ob der Zeitstempel vor dem letzten Sonntag im März um 2:00 Uhr oder nach dem letzten Sonntag im Oktober um 3:00 Uhr liegt, aber das ist ziemlich schwierig, oder?
Mit freundlichen Grüßen,
Christian
Betreff: OLE-Datum (in Sekunden) in TT.MM.JJJJ HH:MM:SS umwandeln (Scripting)Meine Lösung:
Tx-Format-Ansatz:
format(in Tagen(43717)-in Tagen(1)-in Jahren(4) + .479872*inTagen(1),"m/d/yh:m:s");
Mein Berechnungsansatz (geht davon aus, dass die OLE-Zeitzeichenfolge ein Zeichen ist und
relevante Informationen in Utility-Felder extrahiert, nicht auf Tippfehler geprüft):
new column("My_OLE",numeric,"continuous",formula(format(in
Tage(:"OLE_days"-in Tagen(1)-in Jahren(:"OLE_years") +
:"OLE_hhmmss"*indays(1),"d/m/yh:m:s"))) ;
Betreff: OLE-Datum (in Sekunden) in TT.MM.JJJJ HH:MM:SS umwandeln (Scripting)@Neuling2Jumpie
Sie haben Recht ... Ich habe den falschen Ansatz gewählt, um das Problem zu lösen.Die Datumswerte, die Sie haben, sind eigentlich Excel-Datums-/Uhrzeitwerte.Sie basieren auf der Anzahl der Tage seit dem 01.01.1900, (43717) , für die Tage und einen Teil eines Tages, ( .479884 ), für die Zeit und sie beginnen mit Tag 1. JMP-Basis ist die Anzahl der Sekunden seit 01.01.1904 und beginnt bei Tag 0. Die Umrechnungsformel lautet also:
in days(43717)-in days(1)-in years(4) + .479872*indays(1)
Dies kann in der folgenden JSL angezeigt werden
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"
Betreff: OLE-Datum (in Sekunden) in TT.MM.JJJJ HH:MM:SS umwandeln (Scripting)Hintergrund ist, dass dies ein spezieller OLE-basierter datetime-Wert ist. So weit ich war
gesagt, es scheint Sekunden nach 1900 zu sein. EXCEL importiert diese Werte
korrekt (Beispielwerte rechts). JMP nicht.
Vereinfachen wir einfach:
Es macht mir nichts aus, ob das letztendliche JMP-Anzeigeformat US, International,
oder europäisch. Am wichtigsten ist eine funktionierende Umstellung auf ein Mehr
lesbares/allgemeines JMP-Datum/Uhrzeit-Format. Die EXCEL-Spalte zeigt, was die
richtige Ergebnis aussehen sollte.
Übrigens funktionieren die beiden Ansätze nicht richtig. Beide setzen alle Einträge auf
09.09.2019 11:31:01.
Betreff: OLE-Datum (in Sekunden) in TT.MM.JJJJ HH:MM:SS umwandeln (Scripting)Könnten Sie in Sekundenschnelle weitere Informationen zu den JMP-Werten bereitstellen?Wenn ich Jims Idee anwende, sind alle drei Werte gleich.
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"};
Die ersten beiden Einträge sind 3 Sekunden voneinander entfernt, aber die Zahlen sind 0,000030 auseinander
Der erste und der dritte Eintrag sind 1 Sekunde voneinander entfernt, aber die Zahlen sind 0,000012 auseinander.
Was sind die Einheiten der Spalte „JMP-Werte in Sekunden“?
Betreff: OLE-Datum (in Sekunden) in TT.MM.JJJJ HH:MM:SS umwandeln (Scripting)ICH Ich weiß nicht, ob das überhaupt hilft, aber hier ist ein brutaler Weg, um die Konvertierung durchzuführen.Beachten Sie, dass die anfängliche Einstellung des JMP-Datumswerts in einer numerischen US-Struktur vorliegt
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
)
);
Was die Ergebnisse liefert
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";