Code archives/Miscellaneous/Current GMT Date/Time Grabbers

This code has been declared by its author to be Public Domain code.

Download source code

Current GMT Date/Time Grabbers by Yahfree2007
Special thanks to B32 for all the help!

you need these lines in a Decls file in your Blitz3d->userlibs file:

Save as kernel32.decls
.lib "kernel32.dll"

api_GetTimeZoneInformation% (lpTimeZoneInformation*) : "GetTimeZoneInformation"


a set of 2 functions:

CurrentGMTTime()

Basicly the same function as CurrentTime() except it returns GMT time not your computer clocks time.

and

CurrentGMTDate()

Again basicly the same as CurrentDate() but returns GMT date
;--------------------------------------------
;      CurrentGMTTime()
;--------------------------------------------

Function CurrentGMTTime$()
date$ = CurrentDate$()
time$ = CurrentTime$()


	;split date
	day = Mid$(date$, 1, 2)
	mon = (Instr("JanFebMarAprMayJunJulAugSepOctNovDec", Mid$(date$, 4, 3)) + 2) / 3	

	bank = CreateBank(255)
	;retreive timezone info	
	api_GetTimeZoneInformation(bank)
	;offset in minutes for the timezone
	bias = -PeekInt(bank, 0)
	;date when 'normal' time starts	
	month1 = PeekShort(bank, 70);month
	day1 = PeekShort(bank, 74);day
	hour1 = PeekShort(bank, 76);hour
	;date when 'normal' time starts	
	month2 = PeekShort(bank, 154);month
	day2 = PeekShort(bank, 158);day
	hour2 = PeekShort(bank, 160);hour
	;amount of minutes offset in summer	
	daylightbias = PeekInt(bank, 168)
	FreeBank bank
	
	;test for daylightsaving
	test = 0
	If (mon >= month2) And (mon <= month1) Then
		If (mon <> month1) And (mon <> month2) Then test = 1
		If (day >= day2) And (mon = month2) Then test = 1
		If (day <= day1) And (mon = month1) Then test = 1
	End If
	If test Then bias = bias - daylightbias
	
	hour = Int(Mid$(time$, 1, 2)) - (bias / 60.0)
	
	min = Int(Mid$(time$, 4, 2)) - (bias Mod 60)
	If min < 1 Then min = min + 60 hour=hour-1
	If min > 59 Then min = min - 60 hour=hour+1
	
	If hour < 0 Then hour = hour + 24
	If hour > 23 Then hour = hour - 24
	
	sec$ = Right$(time$, 2)
	
	If hour>=10 shour$ = hour
	If hour<10 shour$ = "0"+hour
	If min>=10 smin$ = min
	If min<10 smin$ = "0"+min
	
	time$ = shour + ":" + smin + ":" + sec
	
	Return time$
		
End Function


;--------------------------------------------
;      CurrentGMTDate$()
;--------------------------------------------
Function CurrentGMTDate$()
date$ = CurrentDate$()
time$ = CurrentTime$()

f_mon$=""
	day = Mid$(date$, 1, 2)
	mon = (Instr("JanFebMarAprMayJunJulAugSepOctNovDec", Mid$(date$, 4, 3)) + 2) / 3
	year = Mid(date$,8,4)
    maxdays = Int(Mid$("312831303130313130313031", mon * 2 - 1, 2)) + ((mon = 2) * (year Mod 4 = 0))
	hour = Int(Mid$(time$, 1, 2))
	min = Int(Mid$(time$, 4, 2)) 
	
	bank = CreateBank(255)
	;retreive timezone info	
	api_GetTimeZoneInformation(bank)
	;offset in minutes for the timezone
	bias = -PeekInt(bank, 0)
	;date when 'normal' time starts	
	month1 = PeekShort(bank, 70);month
	day1 = PeekShort(bank, 74);day
	hour1 = PeekShort(bank, 76);hour
	;date when 'normal' time starts	
	month2 = PeekShort(bank, 154);month
	day2 = PeekShort(bank, 158);day
	hour2 = PeekShort(bank, 160);hour
	;amount of minutes offset in summer	
	daylightbias = PeekInt(bank, 168)
	FreeBank bank
	
	test = 0
	If (mon >= month2) And (mon <= month1) Then
		If (mon <> month1) And (mon <> month2) Then test = 1
		If (day >= day2) And (mon = month2) Then test = 1
		If (day <= day1) And (mon = month1) Then test = 1
	End If
	If test Then bias = bias - daylightbias
	
	;If the hour is greater then 23 (24+) then day would be 1 more in GMT
	If hour+bias/60 > 23 day=day+1
	
	;If the hour is lesser then 0 (-1 and below) then the day would be 1 less in GMT
	If hour+bias/60 < 0 day=day-1
	
	;If the day exceeds the max amount of days in the month, then the month would be 1 more in GMT
	If day > maxdays mon=mon+1
	
	;if the day is less then 1 the month would be 1 less in GMT, reset maxdays so it reads the new month..
	; And set the day to the max days in the month (1 less from the next month)
	If day < 1
	mon=mon-1 
	maxdays = Int(Mid$("312831303130313130313031", mon * 2 - 1, 2)) + ((mon = 2) * (year Mod 4 = 0))
	day=maxdays
	End If
	
	;If the month exceeds 12 (months in a year) set months to 1
	If mon > 12 year=year+1 mon = 1
	
	;If the month is less then 1, set months to 12, drop year by 1
	If mon < 1 year=year-1 mon = 12
	
	
	Select mon
	Case 12: f_mon="Dec"
	Case 11: f_mon="Nov"
	Case 10: f_mon="Oct"
	Case 9: f_mon="Sep"
	Case 8: f_mon="Aug"
	Case 7: f_mon="Jul"
	Case 6: f_mon="Jun"
	Case 5: f_mon="May"
	Case 4: f_mon="Apr"
	Case 3: f_mon="Mar"
	Case 2: f_mon="Feb"
	Case 1: f_mon="Jan"
	End Select
	
	If day>=10 sday$ = day
	If day<10 sday$ = "0"+day
	
Return sday + " " + f_mon + " " + year

End Function

Comments

Yahfree2007
and a small example:



Edit: Small issue with minute off set timezones, (IE GMT+5:30 timezones) fixed now!


Chasson629March
Hello,

Are the two detailed procedures (functions) okay to be used without updating the( kernel32.decls ) ? I am looking to aim towards a global hi score table, meaning when the hiscore details are updating, the newer file has precedence. Using GMT regardless of lateral global position means reliable comparisons of the newness of the file. Obviously it would be difficult to get all installations to update the ( kernel32.decls ). So if updating this file is essential I will have to rethink.

I have just a little hope

Jason Romanenko


DanMarch
Your question is not clear enough.
Both functions are using the kernel32 api calls.

If you are giving the compiled exe away, then you do not need to update the kernel32.decls on the targeted machine.

It is enough to update or to add the missing line to the kernel32.decls on your machine.
Only if you give the sourcecode, the decls needs to be updated.


Chasson629March
Thanks ever so much for the swift and informative reply. I have applied the update you specify with positive result.

I do sometimes share executable files. I currently have an interim solution of the game in question ( a memory game using playing cards (graphical representations)). It would be brilliant to make a sort of club with global hi scores functionality.


Code Archives Forum