Code archives/Miscellaneous/Time and Date
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| A generic FileDate() command is included, which works on local files or http streams. Even though the routines are completely different internally, on the surface they appear identical. | |||||
Strict
Extern "win32"
Function gmtime:Byte Ptr(time:Int Ptr)
EndExtern
Print FileDate("http::blitzmax.com/Home/_index_.php").ToString()
Print FileDate("test.exe",0).ToString()
Print FileDate("test.exe",1).ToString()
Function FileDate:TDate(path$,GMT=0)
Select ExtractProtocol(path).tolower()
Case "http"
path=StripProtocol(path)
Local i=path.Find( "/",0 ),server$,file$
If i<>-1
server=path[..i]
file=path[i..]
Else
server=path
file="/"
EndIf
Local stream:TStream=TSocketStream.CreateClient( server,80 )
If Not stream Return
stream.WriteLine "HEAD " + file + " HTTP/1.1"
stream.WriteLine "Host: " + server
stream.WriteLine "Connection: close"
stream.WriteLine ""
Local date:TDate,key$
Local s$,sarr$[]
While Not Eof(stream)
s=stream.ReadLine()
'Print s
sarr=s.split(":")
If sarr.length>1
key=sarr[0].Trim()
If key="Last-Modified" Or key="Date"
'Print s
For Local n=2 To sarr.length-1
sarr[1]:+":"+sarr[n]
Next
sarr=sarr[1].split(",")
If sarr.length>1
date=New TDate
sarr=sarr[1].split("")
If sarr.length>0 date.day=Int(sarr[0])
If sarr.length>1
Select sarr[1].tolower()
Case "jan" date.month=1
Case "feb" date.month=2
Case "mar" date.month=3
Case "apr" date.month=4
Case "may" date.month=5
Case "jun" date.month=6
Case "jul" date.month=7
Case "aug" date.month=8
Case "sep" date.month=9
Case "oct" date.month=10
Case "nov" date.month=11
Case "dec" date.month=12
Default
stream.Close()
Return
EndSelect
EndIf
If sarr.length>2 date.year=Int(sarr[2])
If sarr.length>3
sarr=sarr[3].split(":")
If sarr.length>0 date.hour=Int(sarr[0])
If sarr.length>1 date.minute=Int(sarr[1])
If sarr.length>2 date.second=Int(sarr[2])
EndIf
stream.Close()
If key="Last-Modified" Return date
EndIf
EndIf
EndIf
Wend
stream.Close()
Return date
Default
Local time
time=FileTime(path)
If time=-1 Return
Return TDate.FromTime(time,GMT)
EndSelect
Function ExtractProtocol$(path$)
Local sarr$[]=path.split("::")
If sarr.length>1 Return sarr[0]
EndFunction
Function StripProtocol$(path$)
Local sarr$[]=path.split("::")
If sarr.length>1 Return sarr[1] Else Return path
EndFunction
EndFunction
Type TDate
Field second
Field minute
Field hour
Field day
Field month
Field year
Method Compare:Int(o:Object)
Local date:TDate=TDate(o)
If date.year>year Return 1
If date.year<year Return -1
If date.month>month Return 1
If date.month<month Return -1
If date.day>day Return 1
If date.day<day Return -1
If date.hour>hour Return 1
If date.hour<hour Return -1
If date.minute>minute Return 1
If date.minute<minute Return -1
If date.second>second Return 1
If date.second<second Return -1
Return 0
EndMethod
Function Create:TDate(second,minute,hour,day,month,year)
Local date:TDate
date.second=second
date.minute=minute
date.hour=hour
date.day=day
date.month=month
date.year=year
Return date
EndFunction
Function FromTime:TDate(time,GMT=0)
Local tm:Int Ptr
If GMT
tm = Int Ptr(gmtime(Varptr(time)))
Else
tm = Int Ptr(localtime_(Varptr(time)))
EndIf
Local date:TDate=New TDate
date.second=tm[0]
date.minute=tm[1]
date.hour=tm[2]
date.day=tm[3]
date.month=(tm[4]+1)
date.year=(tm[5]+1900)
Return date
EndFunction
Method ToString$()
Local s$
s="Second: "+second+"~n"
s:+"Minute: "+minute+"~n"
s:+"Hour: "+hour+"~n"
s:+"Day: "+day+"~n"
s:+"Month: "+month+"~n"
s:+"Year: "+year+"~n"
Return s
EndMethod
'I don't know how to convert this to a time stamp
Rem
Method ToTime:Int()
Local time
Local tm:Int Ptr = Int Ptr(localtime_(Varptr(time)))
Local date:TDate=New TDate
date.hour=tm[2]
date.minute=tm[1]
date.second=tm[0]
date.day=tm[3]
date.month=(tm[4]+1)
date.year=(tm[5]+1900)
Return time
EndMethod
EndRem
EndType |
Comments
| ||
| Thx for the code above. I was looking for a way to evaluate the return-value of FileTime() to something usable, found as very often nothing in BRL's official documentation, the code above gave me the answer. |
Code Archives Forum