Code archives/Networking/BlitzUnixTime
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| Gets the Unix Timestamp from 'my' server returning it as an integer. Then dissects the integer to a readable format. Sorry it is just GMT, but where else does time begin anyhow? | |||||
Graphics 800,600,16,2
Print "UnixTime = "+UnixTime()
time$=UTDateandTime$()
Print "The correct time (GMT) is "+time$
Print
Print "Your computer thinks it is "+CurrentDate$()+" - "+CurrentTime$()
FlushKeys
WaitKey()
End
;I needed a firm time reference for my web game, so (with lots of help) I put this together.
;It seems to be very accurate. I compared to BT's 123 service.
;I know that a slightly different php code could have done what the long-winded function does for me,
;but my game only needed an integer to calc from, so had to assemble readable date and time myself.
;Now all I have to do is finish my WhereInTheWorldAreYou() function - anyone already done one?
Function UTDateandTime$()
ut=UnixTime()
days=1+(ut/24/60/60); don't know why but it was always a day slow
For year=1970 To 2039;should exit before we get to 2039
If year Mod 4=0 Then daysinyear=366 Else daysinyear=365
If days<=daysinyear Then Exit
days=days-daysinyear
Next
If daysinyear=366 And days>0 Then mon$="Jan"
If daysinyear=366 And days>31 Then mon$="Feb"
If daysinyear=366 And days>60 Then mon$="Mar"
If daysinyear=366 And days>91 Then mon$="Apr"
If daysinyear=366 And days>121 Then mon$="May"
If daysinyear=366 And days>152 Then mon$="Jun"
If daysinyear=366 And days>182 Then mon$="Jul"
If daysinyear=366 And days>213 Then mon$="Aug"
If daysinyear=366 And days>244 Then mon$="Sep"
If daysinyear=366 And days>274 Then mon$="Oct"
If daysinyear=366 And days>305 Then mon$="Nov"
If daysinyear=366 And days>335 Then mon$="Dec"
If daysinyear=365 And days>0 Then mon$="Jan"
If daysinyear=365 And days>31 Then mon$="Feb"
If daysinyear=365 And days>59 Then mon$="Mar"
If daysinyear=365 And days>90 Then mon$="Apr"
If daysinyear=365 And days>120 Then mon$="May"
If daysinyear=365 And days>151 Then mon$="Jun"
If daysinyear=365 And days>181 Then mon$="Jul"
If daysinyear=365 And days>212 Then mon$="Aug"
If daysinyear=365 And days>243 Then mon$="Sep"
If daysinyear=365 And days>273 Then mon$="Oct"
If daysinyear=365 And days>304 Then mon$="Nov"
If daysinyear=365 And days>334 Then mon$="Dec"
If daysinyear=366 Then Goto leap
If mon$="Dec" Then day=days-334
If mon$="Nov" Then day=days-304
If mon$="Oct" Then day=days-273
If mon$="Sep" Then day=days-243
If mon$="Aug" Then day=days-212
If mon$="Jul" Then day=days-181
If mon$="Jun" Then day=days-151
If mon$="May" Then day=days-120
If mon$="Apr" Then day=days-90
If mon$="Mar" Then day=days-59
If mon$="Feb" Then day=days-31
If mon$="Jan" Then day=days
Goto maketime
.leap
If mon$="Dec" Then day=days-335
If mon$="Nov" Then day=days-305
If mon$="Oct" Then day=days-274
If mon$="Sep" Then day=days-244
If mon$="Aug" Then day=days-213
If mon$="Jul" Then day=days-182
If mon$="Jun" Then day=days-152
If mon$="May" Then day=days-121
If mon$="Apr" Then day=days-91
If mon$="Mar" Then day=days-60
If mon$="Feb" Then day=days-31
If mon$="Jan" Then day=days
.maketime
d$=Right$("0"+Str$(day),2)
y$=Str$(year)
date$=d$+" "+mon$+" "+y$
secs=ut Mod 86400
hour$=Right$("0"+Str$(secs/3600),2)
hours=secs/3600
min$=Right$("0"+Str$((secs/60)-(hours*60)),2)
second$=Right$("0"+Str$(secs Mod 60),2)
t$=hour$+":"+min$+":"+second$
Return date$+" - "+t$
End Function
;Had many helping hands getting this to work - and I still don't know how php does what it does
;I know it's a bit clunky, but at least it's mostly commented for the noobs (like me)
Function UnixTime$(); WORKS!!! Feel free to use this Function.
;As long as I own the domain the php file should work.
DownloadTime("http://www.lexicod.co.uk/unixtime.php", "", "CurrentUnixTime.txt")
Delay 5
mf=ReadFile("CurrentUnixTime.txt")
t$=ReadLine(mf)
x=Left(t$,10)
CloseFile(mf)
Return x
End Function
;* Using a slightly modified version of Devils Child's Download File Function. *
;Many thanks to DC for this.
;=============================================================================================
; ID: 2279
; Author: Devils Child
; Date: 2008-06-26 12:46:33
; Title: Download file
; Description: Supports downloading files, php sites and redirected sites. (Fast)
;=============================================================================================
;link$ - The link. You may enter the link just like you enter it
; in your browser. Very tolerant. No http:// required.
;savepath$ - The path where the file should be saved
;savefile$ - The filename of the saved file. When given "", it will
; be named like the file in the link$.
Function DownloadTime(link$, savepath$ = "", savefile$ = "")
;Strip protocol and return false if not "http"
inst = Instr(link$, "://")
If inst Then
If Lower(Trim(Left(link$, inst - 1))) <> "http" Then Return False
link$ = Right(link$, Len(link$) - inst - 2)
EndIf
;Seperate host from link
inst = Instr(link$, "/")
If inst = 0 Then Return False
host$ = Trim(Left(link$, inst - 1))
link$ = Trim(Right(link$, Len(link$) - inst + 1))
;Seperate path and file from the link
For i = Len(link$) To 1 Step -1
If Mid(link$, i, 1) = "/" Then
link_path$ = Trim(Left(link$, i))
link_file$ = Right(link$, Len(link$) - i)
Exit
EndIf
Next
If link_file$ = "" Then Return False
If savefile$ = "" Then savefile$ = link_file$
;Open TCP stream
tcp = OpenTCPStream(host$, 80)
If tcp = 0 Then Return False
WriteLine tcp, "GET " + link_path$ + link_file$ + " HTTP/1.1" + Chr(13) + Chr(10) + "Host: " + host$ + Chr(13) + Chr(10) + "User-Agent: Download_Function_By_DevilsChild" + Chr(13) + Chr(10)
;Download file
l$ = ReadLine(tcp)
inst1 = Instr(l$, " ")
inst2 = Instr(l$, " ", inst1 + 1)
num = Mid(l$, inst1, inst2 - inst1)
Select num
Case 200
conlen = -1
chunk = False
Repeat
l$ = Trim(ReadLine(tcp))
If l$ = "" Then Exit
inst = Instr(l$, ":")
l1$ = Trim(Left(l$, inst - 1))
l2$ = Trim(Right(l$, Len(l$) - inst))
Select Lower(l1$)
Case "content-length"
conlen = l2$
Case "transfer-encoding"
If Lower(l2$) = "chunked" Then chunk = True
End Select
Forever
If conlen = 0 Then
file = WriteFile(savepath$ + savefile$)
CloseFile file
CloseTCPStream tcp
Return True
ElseIf conlen > 0 Then
file = WriteFile(savepath$ + savefile$)
bnk = CreateBank(4096)
pos = 0
Repeat
avail = conlen - pos
If avail > 4096 Then
ReadBytes bnk, tcp, 0, 4096
WriteBytes bnk, file, 0, 4096
pos = pos + 4096
Else
ReadBytes bnk, tcp, 0, avail
WriteBytes bnk, file, 0, avail
Exit
EndIf
Forever
FreeBank bnk
CloseFile file
CloseTCPStream tcp
Return True
ElseIf chunk Then
file = WriteFile(savepath$ + savefile$)
bnk = CreateBank(4096)
Repeat
l$ = Trim(Upper(ReadLine(tcp)))
ln = 0
For i = 1 To Len(l$)
ln = 16 * ln + Instr("123456789ABCDEF", Mid$(l$, i, 1))
Next
If ln = 0 Then Exit
If BankSize(bnk) < ln Then ResizeBank bnk, ln
ReadBytes bnk, tcp, 0, ln
WriteBytes bnk, file, 0, ln
ReadShort(tcp)
Forever
FreeBank bnk
CloseFile file
CloseTCPStream tcp
Return True
Else
CloseTCPStream tcp
Return False
EndIf
Case 301, 302
Repeat
l$ = Trim(ReadLine(tcp))
If l$ = "" Then Exit
inst = Instr(l$, ":")
l1$ = Trim(Left(l$, inst - 1))
l2$ = Trim(Right(l$, Len(l$) - inst))
Select Lower(l1$)
Case "location"
CloseTCPStream tcp
Return DownloadTime(l2$, savepath$, savefile$)
End Select
Forever
Default
CloseTCPStream tcp
Return False
End Select
End Function |
Comments
| ||
| There are C commands that interrogate the UnixTime directly for you that you can call. |
| ||
| Now you tell me. I have been asking about this for months, and got nowhere. I believe it's easy with other programming languages but not so easy with Blitz2D/3D. I learned a lot from writing these snippets, and hope they can be of use to others. |
| ||
| It should be easy in B3D as well. As I don't have B3D i can't test it but from the code there is at least one error I have seen. A leapyear is not just every 4 years if the year can be devided by 100 without rest (eg 1900) there is no leap year. If the year is also devidable by 400 without rest it is a leapyear again (eg: 2000) Pseudocode: if year modulo 400 is 0 then is_leap_year else if year modulo 100 is 0 then not_leap_year else if year modulo 4 is 0 then is_leap_year else not_leap_year |
| ||
| I knew about the 400 year leap-year, but because UnixTime only runs effectively from 1970 to 2038ish the only century year would be a leap-year anyway, so a simple mod 4 is sufficient. I hear that UnixTime is going 64-bit to eliminate the 2038'bug'. If this happens my code would need to be modified a little - the main modulus utilised should still be valid. Well apart from the odd leap seconds those pesky scientists occasionally add! |
Code Archives Forum