| |
|
|
- Seite 1 - |
|
Christian Schneider | GetUnixtime() erstellt aus der aktuellen Systemzeit einen Unix-Timestamp [...] (Sekunden seit 01.01.1970 0:00 Uhr) ->Rückgabewert: Int
UnixToUTC() wandelt einen Timestamp in UTC-Zeit [...] -> Parameter: Timestamp (Int) -> Rückgabewert: String (Format: TTMMJJSSmmss)
UnixToLocal() wandelt einen Timestamp in lokale Systemzeit -> Parameter: Timestamp (Int) -> Rückgabewert: String (Format: TTMMJJSSmmss) KompilierenMarkierenSeparierenDefinitionen
Def GetSystemTime(1) !"Kernel32.dll","GetSystemTime"
Def SystemTimeToTzSpecificLocalTime(3) !"Kernel32.dll","SystemTimeToTzSpecificLocalTime"
Programm start
CLS
var timestamp% = GetUnixtime()
Print "Timestamp: "+str$(timestamp%)
var time_utc$ = UnixToUTC(timestamp%)
Print "UTC-Zeit: "+left$(time_utc$,2)+"."+mid$(time_utc$,3,2)+"."+mid$(time_utc$,5,4)+" - "+mid$(time_utc$,9,2)+":"+mid$(time_utc$,11,2)+":"+mid$(time_utc$,13,2)
var time_lokal$ = UnixToLocal(timestamp%)
Print "Lokalzeit: "+left$(time_lokal$,2)+"."+mid$(time_lokal$,3,2)+"."+mid$(time_lokal$,5,4)+" - "+mid$(time_lokal$,9,2)+":"+mid$(time_lokal$,11,2)+":"+mid$(time_lokal$,13,2)
Waitkey
Programm ende
Proc GetUnixtime
Declare SYSTEMTIME#
Dim SYSTEMTIME#,16
Declare ut_Jahr%,ut_Monat%,ut_Tag%,ut_Stunde%,ut_Minute%,ut_Sekunde%
var ut_schalttag%=0
Declare tage_bis_monatsanfang%[12]
tage_bis_monatsanfang%[0]=0
tage_bis_monatsanfang%[1]=0
tage_bis_monatsanfang%[2]=31
tage_bis_monatsanfang%[3]=59
tage_bis_monatsanfang%[4]=90
tage_bis_monatsanfang%[5]=120
tage_bis_monatsanfang%[6]=151
tage_bis_monatsanfang%[7]=181
tage_bis_monatsanfang%[8]=212
tage_bis_monatsanfang%[9]=243
tage_bis_monatsanfang%[10]=273
tage_bis_monatsanfang%[11]=304
tage_bis_monatsanfang%[12]=334
GetSystemTime(SYSTEMTIME#)
ut_Jahr%=@Word(SYSTEMTIME#,0)
ut_Monat%=@Word(SYSTEMTIME#,2)
ut_Tag%=@Word(SYSTEMTIME#,6)
ut_Stunde%=@Word(SYSTEMTIME#,8)
ut_Minute%=@Word(SYSTEMTIME#,10)
ut_Sekunde%=@Word(SYSTEMTIME#,12)
if (ut_monat%>2) & (ut_jahr% MOD 4 =0) & (ut_jahr% MOD 100 <> 0)
ut_schalttag%=1
elseif (ut_monat%>2) & (ut_jahr% MOD 400 = 0)
ut_schalttag%=1
endif
DISPOSE SYSTEMTIME#
Return ((tage_bis_monatsanfang%[ut_Monat%]*24*60*60) + (ut_Tag%-1)*24*60*60)+ (ut_Sekunde% + ut_Minute%*60 + ut_Stunde%*60*60) + ((ut_Jahr%-1970) * 365 * 24*60*60 + ((((ut_Jahr%-1)-1968)4 - ((ut_Jahr%-1)-1900)100 + ((ut_Jahr%-1)-1600)400)*24*60*60))+(ut_schalttag%*24*60*60)
Endproc
Proc UnixToUTC
Parameters ut_timestamp%,ut_mode%
Declare ut_schaltjahr%,ut_schalttage%,ut_wochentag%
Declare ut_jahr%,ut_monat%,ut_tag%,ut_stunde%,ut_minute%,ut_sekunde%
if ut_mode%=1
select ((ut_timestamp% 86400) mod 7)
caseof 1 Freitag
ut_wochentag%=5
caseof 2 Samstag
ut_wochentag%=6
caseof 3 Sonntag
ut_wochentag%=0
caseof 4 Montag
ut_wochentag%=1
caseof 5 Dienstag
ut_wochentag%=2
caseof 6 Mittwoch
ut_wochentag%=3
caseof 7 Donnerstag
ut_wochentag%=4
endselect
endif
ut_jahr%=ut_timestamp% (365*24*60*60) + 1970
ut_schalttage%=(((ut_Jahr%-1)-1968)4 - ((ut_Jahr%-1)-1900)100 + ((ut_Jahr%-1)-1600)400)
while (ut_timestamp%-(((ut_jahr%-1970)*365+ut_schalttage%)*24*60*60)+3600) < 0
case (ut_timestamp%-(((ut_jahr%-1970)*365+ut_schalttage%)*24*60*60)+3600) < 0:ut_jahr%=ut_jahr%-1
endwhile
if (ut_jahr% MOD 4 =0) & (ut_jahr% MOD 100 <> 0)
ut_schaltjahr%=1
elseif (ut_jahr% MOD 400 = 0)
ut_schaltjahr%=1
endif
ut_timestamp%=(ut_timestamp%-(((ut_jahr%-1970)*365+ut_schalttage%)*24*60*60))
Select (ut_timestamp% (24*60*60) + 1)
CaseOF > 334+ut_schaltjahr%
ut_monat%=12
ut_timestamp%=ut_timestamp%-((334+ut_schaltjahr%)*24*60*60)
CaseOF > 304+ut_schaltjahr%
ut_monat%=11
ut_timestamp%=ut_timestamp%-((304+ut_schaltjahr%)*24*60*60)
CaseOF > 273+ut_schaltjahr%
ut_monat%=10
ut_timestamp%=ut_timestamp%-((273+ut_schaltjahr%)*24*60*60)
CaseOF > 243+ut_schaltjahr%
ut_monat%=9
ut_timestamp%=ut_timestamp%-((243+ut_schaltjahr%)*24*60*60)
CaseOF > 212+ut_schaltjahr%
ut_monat%=8
ut_timestamp%=ut_timestamp%-((212+ut_schaltjahr%)*24*60*60)
CaseOF > 181+ut_schaltjahr%
ut_monat%=7
ut_timestamp%=ut_timestamp%-((181+ut_schaltjahr%)*24*60*60)
CaseOF > 151+ut_schaltjahr%
ut_monat%=6
ut_timestamp%=ut_timestamp%-((151+ut_schaltjahr%)*24*60*60)
CaseOF > 120+ut_schaltjahr%
ut_monat%=5
ut_timestamp%=ut_timestamp%-((120+ut_schaltjahr%)*24*60*60)
CaseOF > 90+ut_schaltjahr%
ut_monat%=4
ut_timestamp%=ut_timestamp%-((90+ut_schaltjahr%)*24*60*60)
CaseOF > 59+ut_schaltjahr%
ut_monat%=3
ut_timestamp%=ut_timestamp%-((59+ut_schaltjahr%)*24*60*60)
CaseOF > 31
ut_monat%=2
ut_timestamp%=ut_timestamp%-(31*24*60*60)
Otherwise
ut_monat%=1
Endselect
ut_tag% = ut_timestamp% (24*60*60) + 1
ut_timestamp% = (ut_timestamp%-((ut_tag%-1) * 24*60*60))
ut_stunde% = ut_timestamp% (60*60)
ut_timestamp% = (ut_timestamp%-((ut_stunde%)*60*60))
ut_minute% = ut_timestamp% 60
ut_timestamp% = (ut_timestamp%-((ut_minute%)*60))
ut_sekunde% = ut_timestamp%
ifnot ut_mode%=1
Return @If(ut_tag%<10,"0","")+str$(ut_tag%)+@If(ut_monat%<10,"0","")+str$(ut_monat%)+str$(ut_jahr%)+@If(ut_stunde%<10,"0","")+ str$(ut_stunde%)+@If(ut_minute%<10,"0","")+str$(ut_minute%)+@If(ut_sekunde%<10,"0","")+str$(ut_sekunde%)
else
Return str$(ut_jahr%)+@If(ut_monat%<10,"0","")+str$(ut_monat%)+str$(ut_wochentag%)+@If(ut_tag%<10,"0","")+str$(ut_tag%)+@If(ut_stunde%<10,"0","")+str$(ut_stunde%)+@If(ut_minute%<10,"0","")+str$(ut_minute%)+@If(ut_sekunde%<10,"0","")+str$(ut_sekunde%)
EndIF
Endproc
Proc UnixToLocal
Parameters u2l%
Declare SYSTEMTIME#,SYSTEMTIME2#,u2l_return$
Dim SYSTEMTIME#,16
Dim SYSTEMTIME2#,16
Declare ut_rückg$
ut_rückg$ = UnixToUTC(u2l%,1)
Word SYSTEMTIME#,0=val(left$(ut_rückg$,4))
Word SYSTEMTIME#,2=val(mid$(ut_rückg$,5,2))
Word SYSTEMTIME#,4=val(mid$(ut_rückg$,7,1))
Word SYSTEMTIME#,6=val(mid$(ut_rückg$,8,2))
Word SYSTEMTIME#,8=val(mid$(ut_rückg$,10,2))
Word SYSTEMTIME#,10=val(mid$(ut_rückg$,12,2))
Word SYSTEMTIME#,12=val(mid$(ut_rückg$,14,2))
Word SYSTEMTIME#,14=1
SystemTimeToTzSpecificLocalTime(0,SYSTEMTIME#,SYSTEMTIME2#)
u2l_return$ = @IF(@Word(SYSTEMTIME2#,6)<10,"0","")+str$(@Word(SYSTEMTIME2#,6))+@IF(@Word(SYSTEMTIME2#,2)<10,"0","")+str$(@Word(SYSTEMTIME2#,2))+str$(@Word(SYSTEMTIME2#,0))+@IF(@Word(SYSTEMTIME2#,8)<10,"0","")+str$(@Word(SYSTEMTIME2#,8))+@IF(@Word(SYSTEMTIME2#,10)<10,"0","")+str$(@Word(SYSTEMTIME2#,10))+@IF(@Word(SYSTEMTIME2#,12)<10,"0","")+str$(@Word(SYSTEMTIME2#,12))
Dispose SYSTEMTIME#,SYSTEMTIME2#
Return u2l_return$
Endproc
|
|
|
| |
|
|
|
| |
|
- Seite 1 - |
|
Dieter Zornow | Geht leider immer noch nicht, siehe Bild |
|
|
| Er ist ein Mann wie ein Baum. Sie nennen ihn Bonsai., Win 7 32 bit und Win 7 64 bit, mit XProfan X2 | 25.05.2010 ▲ |
|
|
|
|
| Christian Schneider, Beitrag=57201, Zeitpunkt=24.05.2010
Michaels Code habe ich zwischenzeitlich auch entdeckt, allerdings hat mich der Assemblerteil erfolgreich in die Flucht geschlagen ;)
He, Du brauchst doch nur Print UnixTime() schreiben. ^^
Wenn Dein UnixToUTC korrekt funktioniert, dann würde ich daraus später auch gerne ein natives MKTime machen und es in XPSE als echte Funktion integrieren. |
|
|
| |
|
|
|
Christian Schneider | Dieter Zornow, Beitrag=57203, Zeitpunkt=25.05.2010
Geht leider immer noch nicht, siehe Bild
Ich habe es bei mir nochmal unter GMT+7 getestet, auch da funktionierts. Sollte also schonmal nicht an der Zeitzone liegen. Ich könnte mir theoretisch noch vorstellen das die Beta eventuell quer schießt. Hab leider diesmal die Subscription verschlafen und kann denke ich erst im Laufe der Woche damit testen. Habe dir mal eine mit 11.2 erstelle exe angehängt.
Edit: Meine natürlich 11.2 |
|
|
| |
|
|
|
| Du beachtest schon beim Rechnen, dass 32-Bit für einen TimeStamp nicht immer reichen müssen !? (überschaue ich jetzt nicht)
Letzter Anhang funktioniert bei mir hier auf einem 32-Bit-XP-Home korrekt. |
|
|
| |
|
|
|
Christian Schneider | iF, Beitrag=57204, Zeitpunkt=25.05.2010
He, Du brauchst doch nur Print UnixTime() schreiben. ^^
Das mag sein, aber ich versuche Schnipsel zu vermeiden, die ich nichtmal im Ansatz verstehe (Assembler..).
iF, Beitrag=57204, Zeitpunkt=25.05.2010
Wenn Dein UnixToUTC korrekt funktioniert, dann würde ich daraus später auch gerne ein natives MKTime machen und es in XPSE als echte Funktion integrieren.
Werde dich da nicht aufhalten ^^
Bis zum 19. Januar 2038 sollte es mit 32Bit keine Probleme geben. |
|
|
| |
|
|
| |
|
- Seite 2 - |
|
|
| >> die ich nichtmal im Ansatz verstehe (Assembler..).
Nene ich glaube wir reden aneinander vorbei. KompilierenMarkierenSeparieren ... und das wars auch schon.
Da ist nix mit Assembler - kann man einfach so schreiben - bitte vlt. einmal ausprobieren. |
|
|
| |
|
|
|
Christian Schneider | Allerdings, dachte du beziehst dich auf die Codevorlage von Michael. Werde ich (wenn ich das Ganze zeitkritischer benötigen sollte) drauf zurückkommen. |
|
|
| |
|
|
|
| Ich hatte Michaels Code als Vorlage genutzt (wenn auch ein paar Änderungen notwendig waren) zum Einbau der Funktion UnixTime [...] als "echte" native Funktion - ist wie Du sagst für zeitkritische Dinge super oder wenn man diese Funktion in Threads/ CallBacks nutzen mag. Mein Gedanke war halt, dass Du das Ergebnis der einen Funktion zum Vergleich mit dem Ergebnis der anderen Funktion nutzen kannst. |
|
|
| |
|
|
|
Christian Schneider | Habe mal verglichen. Entweder geht meine Funktion um 286 Sekunden nach, oder deine vor
Habe jetzt nochmal folgende Seite zum Vergleich rangezogen: [...] Laut denen scheint mein Wert zu stimmen
Werde heute Abend nochmal schauen wo es da u.U. klemmt. |
|
|
| |
|
|
|
| Ein Grund, weshalb ichs Vergleichen für wichtig halt - irgendwo ist ja immer ein Bug. ^^ |
|
|
| |
|
|
|
Dieter Zornow | Ja du hast recht, es liegt an Beta Version von XProfan, habe den Code gerade mal mit 11.2 getestet, Ergebnis scheint ok. Das muss sich auch Roland anschauen, was da in 12 schief läuft. |
|
|
| Er ist ein Mann wie ein Baum. Sie nennen ihn Bonsai., Win 7 32 bit und Win 7 64 bit, mit XProfan X2 | 25.05.2010 ▲ |
|
|
|
|
RGH | Dieter Zornow, Beitrag=57219, Zeitpunkt=25.05.2010
Ja du hast recht, es liegt an Beta Version von XProfan, habe den Code gerade mal mit 11.2 getestet, Ergebnis scheint ok. Das muss sich auch Roland anschauen, was da in 12 schief läuft.
Ja, XProfan 12ß hat noch ein Problem, wenn SELECT auf ein QuadInt trifft. (Ein Ergebnis einer ganzzahligen Division ist ein QuadInt.) Workaround bis zum nächsten Subscriptionsrelease siehe hier: [...]
Gruß Roland |
|
|
| Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4 | 26.05.2010 ▲ |
|
|
|