Rätt tid på ASP-sidor
Förord
När man pratar om datum och tid i ASP så finns det två delar man ska skilja på. Det första är datum och tidens förhållande till GMT, att vi inte har samma tidzon i exempelvis USA som i Sverige. Och det andra är formateringen av datum och tid, att man i USA skriver datum och tid som 11/22/2002 2:19:40 PM medans i Sverige som 2002-11-22 14:18:09. Denna artikel handlar om det förstnämnda.Innehåll
»»
»
»
När man använder VBScript för att skriva sina ASP-sidor så finns det en hel del funktioner för hanteringen av tid. Exempelvis Now, Date, Time, Year(), Day(), Hour(), Minute(), Second(), Month(), MonthName(), Weekday() och WeekdayName(). Dessa funktioner hämtar sin tidsinformation från webbservern. Så länge som webbservern och besökaren kommer från samma tidzon så innebär detta inget problem. Det är först när man lägger sina ASP-sidor på en webbserver som är inställd till en annan tidzon än besökaren som det blir ett problem.
Lösningen på detta som man oftast ser är helt enkelt att lägga till eller ta bort det antal timmar som skiljer webberverns från besökarens tid med Dateadd(). Exempelvis nedanstående kod som lägger till 5 timmar på webbserverns tid. Detta fungerar visserligen, men ger oftast en ickedynamisk kod då man får ändra en hel del på sina ASP-sidor om man exempelvis byter webbhotell. Det kan också ställa till med en del problem de dagar när man byter mellan sommar- och vintertid.
Lösningen är att utgå direkt från GMT när man bygger sina ASP-sidor. Det finns ingen funktion i ASP som gör detta åt en, utan man måste helt enkelt fråga webbservern om hur långt från GMT dess tid skiljer sig. Denna inställning hittar vi i webbserverns register, närmare bestämt HKEY_LOCAL_MACHINE\System\ CurrentControlSet\Control\ TimeZoneInformation\ActiveTimeBias.
För att hämta ut ett register-värde från en ASP-sida så måste vi använda oss av objektetWScript.Shell. I nedanstående kod öppnar vi objektet WScript.Shell och läser in värdet från register i variabeln strGMTOffsetMin. Värdet i variabeln kommer att innehålla skillnaden mellan webbserverns tid och GMT i minuter, antingen ett positivt eller ett negativt värde beroende på vilken tidzon webbservern är konfigurerad för.
Sedan lägger vi till eller drar ifrån värdet i strGMTOffsetMin till webbserverns tid med hjälp av DateAdd() så får vi vad GMT är.
Det sista steget i vår kod blir sedan att lägga till besökarens tidzon till GMT. För att kunna göra det så måste vi definiera en variabel och ge den ett värde. För de som befinner sig i Sverige så är tidzonen +1. Och det är nog det som de flesta av oss kommer att använda. När man anger värdet för variabeln strGMTTimeZone så kan det vara både positivt och negativt, beroende på varifrån besökaren kommer. Om värdet är positivt så räcker det med att skriva värdet, och om det är negativt måste man ha ett - (minus) före. Om man bygger en webbsite som även har internationella besökare så kan det vara en tanke att dynamiskt anpassa tidzon-värdet beroende på varifrån besökaren kommer.
Och nu ligger vår svenska tid, oavsett var i världen vår webbserver står, i variabeln strNow. Denna kan man sedan i sin resterande ASP-kod använda på samma sätt som man normalt har använt sig av funktionen Now.
Rickard Dehlin arbetar som konsult på WM-Data IT Support i Göteborg. Hans uppdrag är att hjälpa Volvo Cars att migrera från KLAS till Ford Global Client, vilket inkluderar migrering från Novell till Windows 2000 Active Directory, ca 100 file and print servrar och 12.000 Windows XP klienter.
Det vanliga sättet
Lösningen på detta som man oftast ser är helt enkelt att lägga till eller ta bort det antal timmar som skiljer webberverns från besökarens tid med
Dim strNow
strNow = DateAdd("h", 5, Now)
Lösningen
Lösningen är att utgå direkt från GMT när man bygger sina ASP-sidor. Det finns ingen funktion i ASP som gör detta åt en, utan man måste helt enkelt fråga webbservern om hur långt från GMT dess tid skiljer sig. Denna inställning hittar vi i webbserverns register, närmare bestämt HKEY_LOCAL_MACHINE\System\ CurrentControlSet\Control\ TimeZoneInformation\ActiveTimeBias. För att hämta ut ett register-värde från en ASP-sida så måste vi använda oss av objektet
Dim objShell
Dim strGMTOffsetMin
Set objShell = Server.Createobject("WScript.Shell")
strGMTOffsetMin = objShell.RegRead ("HKEY_LOCAL_MACHINE\System\CurrentControlSet\ Control\TimeZoneInformation\ActiveTimeBias")
Set objShell = Nothing
Sedan lägger vi till eller drar ifrån värdet i strGMTOffsetMin till webbserverns tid med hjälp av DateAdd() så får vi vad GMT är.
Dim strGMTNow
strGMTNow = DateAdd("n", strGMTOffsetMin, Now)
Det sista steget i vår kod blir sedan att lägga till besökarens tidzon till GMT. För att kunna göra det så måste vi definiera en variabel och ge den ett värde. För de som befinner sig i Sverige så är tidzonen +1. Och det är nog det som de flesta av oss kommer att använda. När man anger värdet för variabeln strGMTTimeZone så kan det vara både positivt och negativt, beroende på varifrån besökaren kommer. Om värdet är positivt så räcker det med att skriva värdet, och om det är negativt måste man ha ett - (minus) före. Om man bygger en webbsite som även har internationella besökare så kan det vara en tanke att dynamiskt anpassa tidzon-värdet beroende på varifrån besökaren kommer.
Dim strGMTTimeZone
Dim strNow
strGMTTimeZone = 1
strNow = DateAdd("h", strGMTTimeZone, strGMTNow)
Och nu ligger vår svenska tid, oavsett var i världen vår webbserver står, i variabeln strNow. Denna kan man sedan i sin resterande ASP-kod använda på samma sätt som man normalt har använt sig av funktionen Now.
Ett komplett exempel:
Dim objShell
Dim strGMTOffsetMin
Dim strGMTNow
Dim strGMTTimeZone
Dim strNow
strGMTTimeZone = +1
Set objShell = Server.Createobject("WScript.Shell")
strGMTOffsetMin = objShell.RegRead("HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\TimeZoneInformation\ActiveTimeBias")
Set objShell = Nothing
strGMTNow = DateAdd("n", strGMTOffsetMin, Now)
strNow = DateAdd("h", strGMTTimeZone, strGMTNow)
Response.Write("Serverns tid: " & Now & "
" & vbCRLF )
Response.Write("Hur många minuter skiljer serverns tid från GMT?: " & strGMTOffsetMin & "
" & vbCRLF )
Response.Write("GMT tid: " & strGMTNow & "
" & vbCRLF )
Response.Write("Hur många tidzoner skiljer min tidzon från GMT?: " & strGMTTimeZone & "
" & vbCRLF )
Response.Write("Vad är tiden i min tidzon?: " & strNow & "
" & vbCRLF )
0 Kommentarer