Quelltexte/ Codesnippets | | | | ![Sven Bader: 16.05.2024](.././../../i/a/71.gif) Sven Bader | Kann das XProfan wirklich nicht? Auch im Forum habe ich nur Lösungen mit komplizierten Berechnungen gefunden. Diese Lösung hier verwendet die Windows API. Es funktioniert problemlos auch in alten XProfan Versionen.
UPDATE: man kann nun auch ein lesbares Datum in einen Timestamp konvertieren
UPDATE 2: Bereiche werden ordentlich freigegeben, neuere XProfan Versionen funktionieren nun auch mit QuadInt und so mit Daten über 2038 hinaus, ältere XProfan Versionen erhalten ein Fallback
Def RtlSecondsSince1970ToTime(2) !"ntdll.dll", "RtlSecondsSince1970ToTime"
Def RtlTimeToSecondsSince1970(2) !"ntdll.dll", "RtlTimeToSecondsSince1970"
Def FileTimeToSystemTime(2) !"Kernel32.dll", "FileTimeToSystemTime"
Def SystemTimeToFileTime(2) !"Kernel32.dll", "SystemTimeToFileTime"
Struct SYSTEMTIME = y%,m%,w%,d%,h%,i%,s%,millisecond%
Proc Date2UnixTime
Parameters dateString$
Declare systemTime#, datePart$, timePart$, fileTime#
Dim systemTime#, SYSTEMTIME
Dim fileTime#,8
datePart$ = SubStr$(dateString$,1," ")'Datum
timePart$ = SubStr$(dateString$,2," ")'Uhrzeit
systemTime#.y% = Val(SubStr$(datePart$,1,"-"))// Jahr
systemTime#.m% = Val(SubStr$(datePart$,2,"-"))// Monat
systemTime#.d% = Val(SubStr$(datePart$,3,"-"))// Tag
systemTime#.h% = Val(SubStr$(timePart$,1,":"))// Stunde
systemTime#.i% = Val(SubStr$(timePart$,2,":"))// Minute
systemTime#.s% = Val(SubStr$(timePart$,3,":"))// Sekunde
systemTime#.millisecond% = 0// Millisekunde
SystemTimeToFileTime(systemTime#, fileTime#)
$IFDEF VER12.0
Declare Quad unixTimeQuad
RtlTimeToSecondsSince1970(fileTime#, Addr(unixTimeQuad))
Dispose fileTime#, systemTime#
Return unixTimeQuad
$ELSE
'Achtung Quadint, das funktioniert nur bis 2038!
Declare unixTime&, unixTime#
Dim unixTime#,8
RtlTimeToSecondsSince1970(fileTime#,unixTime#)
unixTime& = Long(unixTime#,0)
Dispose fileTime#, systemTime#, unixTime#
Return unixTime&
$ENDIF
EndProc
Proc UnixTime2Date
Parameters fileTime&
Declare fileTime#, t#, output$
Dim fileTime#,8
Dim t#, SYSTEMTIME
RtlSecondsSince1970ToTime(fileTime&, fileTime#)
FileTimeToSystemTime(fileTime#, t#)
output$ = Str$( t#.d%) + "." + Str$(t#.m%) +"." + Str$(t#.y%) + " " + Str$(t#.h%) + ":" + Str$(t#.i%) +":" + Str$(t#.s%)
Dispose t#, fileTime#
Return output$
EndProc
Cls
Print UnixTime2Date(2504776539)
Print Date2UnixTime("2049-05-16 11:15:39")
WaitKey
End
|
| | | | |
| | ![Georg Teles: 23.05.2024](.././../../i/a/910.gif) Georg Teles | Interessant,
funktioniert problemlos mit 8, 10, x2 und x4 auf jeden Fall ![](.././../../i/s/top.gif) |
| | | | |
| | ![Jens-Arne Reumschüssel: 05.07.2024](.././../../i/a/171494484748f1e66bd153d.jpg) Jens-Arne Reumschüssel | Hallo,
sehr interessant! Kann man bestimmt mal gut verwenden.
Kleine Anmerkung: Ich weiß nicht, ob es so gut ist, Zeiger auf lokal deklarierte Bereichsvariablen als Proc-Ergebnisse zurückzugeben. Die werden so nirgends mehr disposed (=Speicherleck, jedenfalls mindestens während der Programmlaufzeit, sofern XProfan oder Windows das beim Programmende behebt, sonst permanent, bis der Computer neu gestartet wird).
Beste Grüße, Jens-Arne |
| | | XProfan X4XProfan X4 * Prf2Cpp * XPSE * JRPC3 * Win11 Pro 64bit * PC i7-7700K@4,2GHz, 32 GB RAM PM: jreumsc@web.de | 05.07.2024 ▲ |
| |
| | ![Sven Bader: 05.07.2024](.././../../i/a/71.gif) Sven Bader | UPDATE: Die neuste Version befindet sich im Original-Beitrag ganz oben!
Danke für das Feedback Jens-Arne!
Ich fand die Zwischenschritte als Funktion ganz nett aber letztendlich braucht man sie nicht und es wird lesbarer und leichter zu verwenden ohne:
Def RtlSecondsSince1970ToTime(2) !"ntdll.dll", "RtlSecondsSince1970ToTime"
Def RtlTimeToSecondsSince1970(2) !"ntdll.dll", "RtlTimeToSecondsSince1970"
Def FileTimeToSystemTime(2) !"Kernel32.dll", "FileTimeToSystemTime"
Def SystemTimeToFileTime(2) !"Kernel32.dll", "SystemTimeToFileTime"
Struct SYSTEMTIME = y%,m%,w%,d%,h%,i%,s%,millisecond%
Proc FileTimeToUnixTime
Parameters dateString$
Declare systemTime#, datePart$, timePart$, fileTime#, filetime&, unixTime&, unixTime#
Dim systemTime#, SYSTEMTIME
Dim fileTime#,8
Dim unixTime#,8
datePart$ = SubStr$(dateString$,1," ")'Datum
timePart$ = SubStr$(dateString$,2," ")'Uhrzeit
systemTime#.y% = Val(SubStr$(datePart$,1,"-"))// Jahr
systemTime#.m% = Val(SubStr$(datePart$,2,"-"))// Monat
systemTime#.d% = Val(SubStr$(datePart$,3,"-"))// Tag
systemTime#.h% = Val(SubStr$(timePart$,1,":"))// Stunde
systemTime#.i% = Val(SubStr$(timePart$,2,":"))// Minute
systemTime#.s% = Val(SubStr$(timePart$,3,":"))// Sekunde
systemTime#.millisecond% = 0// Millisekunde
SystemTimeToFileTime(systemTime#, fileTime#)
RtlTimeToSecondsSince1970(fileTime#, unixTime#)
'Achtung Quadint, das funktioniert nur bis 2038!
unixTime& = Long(unixTime#,0)
Dispose fileTime#, systemTime#, unixTime#
Return unixTime&
EndProc
Proc FileTimeToReadable
Parameters fileTime&
Declare fileTime#, t#, output$
Dim fileTime#,8
Dim t#, SYSTEMTIME
RtlSecondsSince1970ToTime(fileTime&, fileTime#)
FileTimeToSystemTime(fileTime#, t#)
output$ = Str$( t#.d%) + "." + Str$(t#.m%) +"." + Str$(t#.y%) + " " + Str$(t#.h%) + ":" + Str$(t#.i%) +":" + Str$(t#.s%)
Dispose t#, fileTime#
Return output$
EndProc
Cls
Print FileTimeToReadable(1715858139)
Print FileTimeToUnixTime("2024-05-16 11:15:39")
Waitkey
End
|
| | | | |
| | ![Jens-Arne Reumschüssel: 06.07.2024](.././../../i/a/171494484748f1e66bd153d.jpg) Jens-Arne Reumschüssel | Das sieht doch schon richtig gut aus!
Man kann natürlich ein Quad nehmen, um auch in 15 Jahren noch dabei zu sein:
Declare Quad unixTimeQuad RtlTimeToSecondsSince1970(fileTime#, Addr(unixTimeQuad)) Return unixTimeQuad |
| | | XProfan X4XProfan X4 * Prf2Cpp * XPSE * JRPC3 * Win11 Pro 64bit * PC i7-7700K@4,2GHz, 32 GB RAM PM: jreumsc@web.de | 06.07.2024 ▲ |
| |
| | ![Sven Bader: 06.07.2024](.././../../i/a/71.gif) Sven Bader | Danke! Ich habe deinen Vorschlag mit Compiler-Weiche für neuere XProfan Versionen übernommen und meine durch das letzte Update irreführenden Funktionsnamen geändert. Der Code ist im Original-Beitrag. Aufgrund von Performance und der Profan2Cpp Kompatibilität hänge ich meist selbst noch auf XProfan 11 fest. |
| | | | |
| | ![Jens-Arne Reumschüssel: 06.07.2024](.././../../i/a/171494484748f1e66bd153d.jpg) Jens-Arne Reumschüssel | Ich habe mal eine kleine DLL für die Nutzung von QuadInts in XProfan bis Version 11 geschrieben, siehe hier: [...] ![](/intl/i/lnk.gif)
Damit sollte man auch für ältere Profan-Versionen Deinen schönen UnixTime-Code zukunftsfähig machen können. Es wird ja überwiegend um Vergleiche von solchen Zeiten gehen, und die kann die DLL problemlos bewerkstelligen. |
| | | XProfan X4XProfan X4 * Prf2Cpp * XPSE * JRPC3 * Win11 Pro 64bit * PC i7-7700K@4,2GHz, 32 GB RAM PM: jreumsc@web.de | 06.07.2024 ▲ |
| |
| | ![Jens-Arne Reumschüssel: 07.07.2024](.././../../i/a/171494484748f1e66bd153d.jpg) Jens-Arne Reumschüssel | Hier eine Version, die für alte Profane QuadInt.dll nutzt. Das hat auch den Vorteil, dass das Ergebnis nicht negativ dargestellt wird (LongInt ist bis zum letzten Bit ausgenutzt und in XProfan nunmal signed), was zur Visualisierung der Sekunden seit dem 01.01.1970 nicht hilfreich ist.
$IFNDEF VER12.0
$I QuadInt.inc
$ENDIF
Def RtlSecondsSince1970ToTime(2) !"ntdll.dll", "RtlSecondsSince1970ToTime"
Def RtlTimeToSecondsSince1970(2) !"ntdll.dll", "RtlTimeToSecondsSince1970"
Def FileTimeToSystemTime(2) !"Kernel32.dll", "FileTimeToSystemTime"
Def SystemTimeToFileTime(2) !"Kernel32.dll", "SystemTimeToFileTime"
Struct SYSTEMTIME = y%,m%,w%,d%,h%,i%,s%,millisecond%
Proc Date2UnixTime
Parameters dateString$
Declare systemTime#, datePart$, timePart$, fileTime#
Dim systemTime#, SYSTEMTIME
Dim fileTime#,8
datePart$ = SubStr$(dateString$,1," ")'Datum
timePart$ = SubStr$(dateString$,2," ")'Uhrzeit
systemTime#.y% = Val(SubStr$(datePart$,1,"-"))// Jahr
systemTime#.m% = Val(SubStr$(datePart$,2,"-"))// Monat
systemTime#.d% = Val(SubStr$(datePart$,3,"-"))// Tag
systemTime#.h% = Val(SubStr$(timePart$,1,":"))// Stunde
systemTime#.i% = Val(SubStr$(timePart$,2,":"))// Minute
systemTime#.s% = Val(SubStr$(timePart$,3,":"))// Sekunde
systemTime#.millisecond% = 0// Millisekunde
SystemTimeToFileTime(systemTime#, fileTime#)
$IFDEF VER12.0
Declare Quad unixTimeQuad
RtlTimeToSecondsSince1970(fileTime#, Addr(unixTimeQuad))
Dispose fileTime#, systemTime#
Return unixTimeQuad
$ELSE
'Achtung Quadint, das funktioniert nur bis 2038!
Declare unixTime&, unixTime#
Dim unixTime#,8
RtlTimeToSecondsSince1970(fileTime#,unixTime#)
RtlTimeToSecondsSince1970(fileTime#,QuadAddr(1))
unixTime& = Long(unixTime#,0)
Dispose fileTime#, systemTime#, unixTime#
Return unixTime&
$ENDIF
EndProc
Proc UnixTime2Date
Parameters fileTime&
Declare fileTime#, t#, output$
Dim fileTime#,8
Dim t#, SYSTEMTIME
RtlSecondsSince1970ToTime(fileTime&, fileTime#)
FileTimeToSystemTime(fileTime#, t#)
output$ = Str$( t#.d%) + "." + Str$(t#.m%) +"." + Str$(t#.y%) + " " + Str$(t#.h%) + ":" + Str$(t#.i%) +":" + Str$(t#.s%)
Dispose t#, fileTime#
Return output$
EndProc
Cls
Print UnixTime2Date(2504776539)
$IFDEF VER12.0
Print Date2UnixTime("2049-05-16 11:15:39")
$ELSE
InitQuadInt(1)
Date2UnixTime("2049-05-16 11:15:39")
Print QuadGetStr(1)
$ENDIF
WaitKey
End
|
| | | XProfan X4 * Prf2Cpp * XPSE * JRPC3 * Win11 Pro 64bit * PC i7-7700K@4,2GHz, 32 GB RAM PM: jreumsc@web.de | 07.07.2024 ▲ |
| |
|
Zum QuelltextThemenoptionen | 515 Betrachtungen |
ThemeninformationenDieses Thema hat 3 Teilnehmer: |