Deutsch
Quelltexte/ Codesnippets

Unix Time Stamp (Sekunden seit 01.01.1970) in lesbares Datum umwandeln

 

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
 
16.05.2024  
 




Georg
Teles
Interessant,

funktioniert problemlos mit 8, 10, x2 und x4 auf jeden Fall
 
Alle Sprachen
TC-Programming [...] 
XProfan 8.0 - 10.0 - X2 - X3 - X4

23.05.2024  
 




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 X4
XProfan X4 * Prf2Cpp * XPSE * JRPC3 * Win11 Pro 64bit * PC i7-7700K@4,2GHz, 32 GB RAM
PM: jreumsc@web.de
05.07.2024  
 




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
 
05.07.2024  
 




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 X4
XProfan X4 * Prf2Cpp * XPSE * JRPC3 * Win11 Pro 64bit * PC i7-7700K@4,2GHz, 32 GB RAM
PM: jreumsc@web.de
06.07.2024  
 




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.
 
06.07.2024  
 




Jens-Arne
Reumschüssel
Ich habe mal eine kleine DLL für die Nutzung von QuadInts in XProfan bis Version 11 geschrieben, siehe hier:  [...] 

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 X4
XProfan 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
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 Quelltext


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

515 Betrachtungen

Unbenanntvor 0 min.
Gast.0815 vor 18 Tagen
Georg Teles vor 28 Tagen
ScanMaster07.08.2024
ByteAttack20.07.2024
Mehr...

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie