Atomzeit aus dem internet - Mein Einstand ! ACHTUNG NEU !

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

 

PsionMan

Betreff: Atomzeit aus dem internet - Mein Einstand ! ACHTUNG NEU !

BeitragSa, Okt 09, 2004 17:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Vieleicht kann das einer gebrauchen ?

Neue Version weiter Tiefer Smile

BlitzBasic: [AUSKLAPPEN]
server$ = "swisstime.ethz.ch" ; Die Zeitserver-Adresse 

Repeat

stream = OpenTCPStream(server$, 37) ; Die Verbindung zum Server auf Port 37 herstellen.

; Zeitserver auslesen / es werden immer nur 4 byte vom Server gesendet
byte1 = ReadByte(stream)
byte2 = ReadByte(stream)
byte3 = ReadByte(stream)
byte4 = ReadByte(stream)

;bytes in vergangene sekunden umwandelen
sek#=byte4+byte3*256+byte2*256*256+byte1*256*256*256-3305570400

;Integerwert wäre für variable zu gross deswegen
;sekunden (3305484000) von 1.1.1900 bis 1.10.2004 abziehen

tag=Floor(sek/86400) ; tage seit dem 1.10.2004

; Julianday=2453280+tag ; für spätere datumarithmetik

sek#=sek#-tag*86400
stunden=Int(Floor(sek/3600))
minuten=Floor((sek/3600-stunden)*60)
sekunden=Floor(sek-(stunden*3600+minuten*60))
If sekunden=60 Then sekunden=0 ; beseitigt zeitweise rundungsfehler Wink
Print stunden+":"+minuten+":"+sekunden
CloseTCPStream stream
Forever

WaitKey
  • Zuletzt bearbeitet von PsionMan am Mo, Okt 11, 2004 20:45, insgesamt einmal bearbeitet
 

Blitzkrieg Bop

BeitragSa, Okt 09, 2004 18:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Willkommen!
Netter Einstand! Smile
Allerdings sind auch hier gewisse Anfänger Sachen zu erkennen, die nicht so toll sind. Ich habe dir den Code ein wenig angepasst, mit besseren Befehlen, z.B Text anstatt Print. Außerdem CLS eingeführt und halt Double Buffering. Dein Waitkey am Ende des Codes ist nutzlos und außerdem kann man nun das Prog mit ESC beenden.

BlitzBasic: [AUSKLAPPEN]

Graphics 640,480,16,2
SetBuffer BackBuffer()

server$ = "swisstime.ethz.ch" ; Die Zeitserver-Adresse

Repeat
Cls
stream = OpenTCPStream(server$, 37) ; Die Verbindung zum Server auf Port 37 herstellen.

; Zeitserver auslesen / es werden immer nur 4 byte vom Server gesendet
byte1 = ReadByte(stream)
byte2 = ReadByte(stream)
byte3 = ReadByte(stream)
byte4 = ReadByte(stream)

;bytes in vergangene sekunden umwandelen
sek#=byte4+byte3*256+byte2*256*256+byte1*256*256*256-3305570400

;Integerwert wäre für variable zu gross deswegen
;sekunden (3305484000) von 1.1.1900 bis 1.10.2004 abziehen

tag=Floor(sek/86400) ; tage seit dem 1.10.2004

; Julianday=2453280+tag ; für spätere datumarithmetik

sek#=sek#-tag*86400
stunden=Int(Floor(sek/3600))
minuten=Floor((sek/3600-stunden)*60)
sekunden=Floor(sek-(stunden*3600+minuten*60))
If sekunden=60 Then sekunden=0 ; beseitigt zeitweise rundungsfehler Wink
;Print stunden+":"+minuten+":"+sekunden
Text 640/2,480/2,"Zeit: "+stunden+":"+minuten+":"+sekunden,1,1
CloseTCPStream stream
Flip
Until KeyHit(1):End
~ Hey Ho Let's Go ~
 

Edlothiol

BeitragSa, Okt 09, 2004 18:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich kann mir übrigens irgendwie nicht vorstellen, dass es was bringt da 3305570400 abzuziehen, denn das Zwischenergebnis muss ja auch irgendwo gespeichert werden - allerdings klappts ja scheinbar.
 

PsionMan

Betreff: danke! werde meinen Code-Still verbessern !

BeitragSa, Okt 09, 2004 18:25
Antworten mit Zitat
Benutzer-Profile anzeigen
@Blitzkrieg Bop :
Embarassed danke! werde meinen Code-Still verbessern ! Embarassed
sollte allerdings nur den weg zeigen Wink

@Edlothiol
Habe auch nicht Glauben wollen, aber nach 2,5 Stunden rumprobieren Very Happy hab ich es dann so gemacht!

@ALL
Wer noch mehr Verbesserungen vornehmen (z.B. Ohne die "3305570400")möchte kann das gerne tun ! Smile
 

Edlothiol

BeitragSa, Okt 09, 2004 19:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Ach ja, statt *256 kann man auch Shl 8, statt *256*256 Shl 16 und statt *256*256*256 Shl 24 schreiben. Da fällt mir auf, der Wert sollte auch eigentlich gar nicht zu groß für einen Int sein...
 

PsionMan

Betreff: Versteh das mit der Var auch nicht ....

BeitragSa, Okt 09, 2004 19:27
Antworten mit Zitat
Benutzer-Profile anzeigen
@Edlothiol
Crying or Very sad Warum die IntegerVar den falschen Wert annimmt wenn sie zu gross ist ? ....
versuch es doch einer mal selber !

Alte Version zum Testen (funktionierende Version...Siehe ganz Oben!):
BlitzBasic: [AUSKLAPPEN]

server$ = "swisstime.ethz.ch" ; Die Zeitserver-Adresse
Repeat
stream = OpenTCPStream(server$, 37) ; Die Verbindung zum Server auf Port 37 herstellen.

; Zeitserver auslesen / es werden immer nur 4 byte vom Server gesendet
byte1 = ReadByte(stream)
byte2 = ReadByte(stream)
byte3 = ReadByte(stream)
byte4 = ReadByte(stream)
;bytes in vergangene sekunden umwandelen
sek_ohne_Abzug=byte4+byte3*256+byte2*256*256+byte1*256*256*256 ;-3305570400
sek_mit_Abzug=byte4+byte3*256+byte2*256*256+byte1*256*256*256 -3305570400


Print "Ohne Abzug="+sek_ohne_Abzug+" Mit Abzug="+sek_mit_Abzug
CloseTCPStream stream
Forever
End


ohne abzug der Zahl kommt eine hohe Negativzahl raus!!!
was eigentlich nicht kann sein und darf !!! Shocked

Wer hat ne Erklärung für mich ?????
 

Apocalyptic

BeitragSo, Okt 10, 2004 0:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab mich zwar nicht mit deinem Code beschäftigt, aber schau dir mal den Aufbau von Integern an (zumindest von denen, die in BB verwendet werden). Die bestehen aus 32 Bit, und wenn das erste "1" ist, ist die Zahl negativ. Dh. eine zu hohe Zahl wird negativ, wenn das erste Bit "1" ist. Durch das Substrahieren deiner Zahl ist das erste Bit ist auf gar keinen Fall "1".
Suum cuique

[ www.ffs-net.de.vu ] [ Raycaster ]
 

PsionMan

BeitragSo, Okt 10, 2004 17:51
Antworten mit Zitat
Benutzer-Profile anzeigen
@Apocalyptic

Idea Herzlichen Dank für die Erklärung Idea
 

PsionMan

Betreff: Neue Version

BeitragMo, Okt 11, 2004 21:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier die neue überarbeitete Version mit Wochentag & Datum !
BlitzBasic: [AUSKLAPPEN]

Global server$ = "swisstime.ethz.ch" ; Die Zeitserver-Adresse
Global Julianday,stunden,minuten,sekunden
window=CreateWindow ("Egal",0,0,200,8,0,1)
hWND=QueryObject(window,2)
Repeat


Atomzeit()

Zeit$=DatumAusJulian2$(Julianday)+" "+stunden+":"+Right$("0"+Str$(minuten),2)+":"+Right$("0"+Str$(sekunden),2)
api_SetWindowText(hWND,zeit$)

Until KeyHit(1) ;Or WaitEvent()=$803
End

Function Atomzeit()
stream = OpenTCPStream(server$, 37) ; Die Verbindung zum Server auf Port 37 herstellen.

; Zeitserver auslesen / es werden immer nur 4 byte vom Server gesendet
byte1 = ReadByte(stream)
byte2 = ReadByte(stream)
byte3 = ReadByte(stream)
byte4 = ReadByte(stream)

;bytes in vergangene sekunden umwandelen
sek#=(byte1 Shl 24) + (byte2 Shl 16) + (byte3 Shl 8 ) +byte4 - 3305570400

;Integerwert wäre für variable zu gross deswegen
;sekunden (3305484000) von 1.1.1900 bis 1.10.2004 abziehen

tag=Floor(sek/86400) ; tage seit dem 1.10.2004

Julianday=2453280+tag ; für spätere datumarithmetik

sek#=sek#-tag*86400
stunden=Int(Floor(sek/3600))
minuten=Floor((sek/3600-stunden)*60)
sekunden=Floor(sek-(stunden*3600+minuten*60))

If sekunden=60 Then sekunden=0 ; beseitigt zeitweise rundungsfehler Wink
CloseTCPStream stream
End Function

Function DatumAusJulian2$(tag)
v1=tag+68569
v2=(4*v1)/146097
v1=v1-(146097*v2+3)/4
v3=(4000*(v1+1))/1461001
v1=v1-(1461*v3)/4+31
v4=(80*v1)/2447
v5=v4/11
t=v1-(2447*v4)/80
m=v4+2-(12*v5)
j=100*(v2-49)+v3+v5
Select m
Case 1:monat$="Jan"
Case 2:monat$="Feb"
Case 3:monat$="Mär"
Case 4:monat$="Apr"
Case 5:monat$="Mai"
Case 6:monat$="Jun"
Case 7:monat$="Jul"
Case 8:monat$="Aug"
Case 9:monat$="Sep"
Case 10:monat$="Okt"
Case 11:monat$="Nov"
Case 12:monat$="Dez"
End Select
If DatumPruefen(t,m,j)=1 Then
Return Right$("0"+Str$(t),2)+"."+monat$+"."+Right$("0000"+Str$(j),4)
EndIf
End Function

Function DatumPruefen(tag,monat,jahr)
If jahr>1582 And jahr<4713 Then
If monat>0 And monat<13 Then
maxtage=TageImMonat(monat,jahr)
If tag>0 And tag<maxtage+1 Then Return 1
EndIf
EndIf
End Function

Function TageImMonat(monat,jahr)
If jahr<1583 Or jahr>4712 Then Return
If monat<1 Or monat>12 Then Return
If monat=1 Or monat=3 Or monat=5 Or monat=7 Or monat=8 Or monat=10 Or monat=12 Then Return 31
If monat=2 Or monat=4 Or monat=6 Or monat=9 Or monat=11 Then Return 30
If monat=2 Then
tage=28
If (jahr Mod 4)=0 Then tage=29
If (jahr Mod 100)=0 Then tage=28
If (jahr Mod 400)=0 Then tage=29
Return tage
EndIf
End Function

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group