Jag bloggar numera på http://blog.dileno.com ».

Formatera datum i ASP.NET

en ASP.NET-artikel av Martin S., publicerad den 2 maj 2005
Att visa datum som man vill på en webbsida kan vara nog så krångligt. Ofta har det varit svårt att hitta den rätta formateringen, eller så har det uppstått typkonverteringsproblem. I mitt fall har jag tagit till andra metoder för att formatera datum som jag vill – metoder som egentligen har varit totalt onödiga. I denna artikel visar jag hur man relativt enkelt med hjälp av en inbyggd klass i .NET kan formatera datum precis som man vill – med klassen DateTimeFormatInfo.

CultureInfo-klassen


Till att börja med ska vi i @Page-direktivet högst upp på vår ASP.NET-sida ställa in attributet Culture till sv-SE, som innebär att vi har svensk datumstandard på vår sida. Så här ska @Page-direktivet se ut:

<%@ Page Language=”VB” Culture=”sv-SE” %>
CultureInfo är klassen som representerar information om t.ex vilken kalender, datumstandard eller sifferstandard ett land använder. sv-SE är Sveriges kulturstandard. en-US är USAs standard, och en-GB är Storbritanniens standard. Det finns kulturstandarder för hela värden inbyggda i .NET. En klass som är högst relaterad till CultureInfo-klassen, är klassen DateTimeFormatInfo, som man har användning av när man vill formatera datum i ASP.NET.

Sidan du arbetar med bör se ut så här: (kopiera och klistra in, spara sen som ny aspx-sida)

<%@ Page Language="VB" Culture="sv-SE" %>
<script runat="server">

sub page_load()
dim dt as datetime = datetime.now()
lbl1.text = dt
end sub

</script>
<html>
<head>
</head>
<body>
<form runat="server">
<asp:label id="lbl1" runat="server" />
</form>
</body>
</html>

Datum i .NET


När jag kodade klassisk ASP så fick jag alltid fram det datum jag ville ha genom att tilldela en variabel datumvärdet now(). now() finns även i .NET, och fungerar alldeles utmärkt för vårt ändamål. Så här ser det ut i ASP.NET när jag vill ge en variabel ett datumvärde:

dim dt as datetime = datetime.now()
Vi deklarerar variabeln dt, som får värdet now(), som är datumet exakt just nu. Variabelns datatyp är viktig – den ska vara datetime för att man ska kunna formatera datumet som man vill. När variabeln fått sitt datumvärde vill man ofta skriva ut variabeln. Skulle vi skriva ut den som det är nu, så kommer vi att få ett datum som ser ut ungefär så här: 2005-02-08 21:12:09. Men – det finns så mycket mer man kan göra än att bara skriva ut datumet som det är. Vill man bara skriva ut dag, månad och år, så går det bra. Vill man inte skriva ut år, så går det också bra. Det gäller bara att veta vilka datumformat som finns och vilka man vill använda.

Det är inte alltid du vill tilldela en variabel tiden som är just nu. Vill du att en variabel ska ha värdet ”8/2/2005” så skriver du så här:

dim dt as datetime = #2/8/2005#
Vill du sen skriva ut variabeln på en sida, så kan du skriva ut den direkt, eller så kan du typkonvertera variabeln till en sträng. Till detta har vi toString()-metoden:

dim dt as datetime = #2/8/2005#
lbl1.text = dt.toString()

Detta görs alltså genom att lägga till .toString() efter variabeln. I alla fall jag har alltid som regel att typkonvertera variabler som inte är strängar till strängar innan jag skriver ut dem på sidan. När man arbetar med olika datatyper så bör man vara konsekvent och konvertera alla till strängar, i stället för att bara konvertera vissa. I slutändan kan detta spara tid. Det finns tillfällen då jag inte varit konsekvent, och ”glömt” bort att en datatyp som genererat ett error inte gjorts om till en sträng innan jag försökte skriva ut den på sidan.

Datumformat


I .NET finns ett gäng inbyggda datumformat. Med hjälp av dessa kan du formatera dina datum precis som du vill. Datumet ovan, 2005-02-08 21:12:09 skulle i datumformat se ut så här: yyyy-MM-dd HH-mm-ss

yyyy är år, MM är månad, dd dagen i månaden, HH är timmen, mm är minuter och ss sekunderna. Det finns även fler datumformat, och med några av dem ska jag visa hur man formaterar datum så att det passar de egna behoven.

Skulle man vilja skriva ut ett datum så att enbart ”den 8 februari 2005” stod skrivet, så skriver man så här:

dim dt as datetime = datetime.now()
lbl1.text = dt.toString("D")

D är en formategenskap, som har beskrivningen LongDatePattern, vilket innebär att datumet ska skrivas ut. Skulle man vilja skriva ut datumet som ”2005-02-98” så byter man ut formategenskapen D till d, som har beskrivningen ShortDatePattern.

Man kan även formatera tiden, och liksom det finns Long/ShortDatePattern finns det Long/ShortTimePattern. Du använder bara formategenskapen T för långt tidsformat (exempelvis 22:12:36) eller t för kort tidsformat, där sekunderna skippas (22:12).

Tabell: formategenskaper
FormatExempel
d2005-02-08
Dden 8 februari 2005
fden 8 februari 2005 22:12
Fden 8 februari 2005 22:12:36
g2005-02-08 22:12
G2005-02-08 22:12:36
mden 8 februari
rTue, 08 Feb 2005 22:12:36 GMT
s2005-02-08T22:12:36
t22:23
T22:12:36
u2005-02-08 22:12:36Z
Uden 8 februari 2005 22:12:36
yfebruari 2005


Är man inte nöjd med formategenskaperna, så finns det formatmönster att använda sig av. Med hjälp av formatmönstrena kan man skräddarsy hur man vill visa datum. Säg att man skulle vilja skriva ut ”tisdag, 8 februari 2005”. Då kan man skriva så här:

dt.toString("dddd\, d MMMM yyyy")
dddd står för veckodagens hela namn, d för dagen i månaden, MMMM för månadens namn och yyyy för året.

Vill man skriva datumet som ”den 8 feb 05, kl 22:12” så använder man detta formatmönster:

dt.toString(”\den d MMM yy\, kl HH:mm")
När man vill skriva ren text använder man backslash \text så att texten tolkas som text, och inte som formatmönster. d står för dagen i månaden, MMM är förkortning för månadens namn, yy är årtalet utan årtusende-siffrorna, HH är timmen och mm är minuten i timmen.

Tabell: formatmönster
FormatExempel
d8 (dag 8 i månaden)
dd08 (en nolla före)
dddtis (förkortning på veckodagen)
dddd(tisdag)
M2 (månad 2 på året)
MM02 (en nolla före)
MMMfeb (förkortning för månaden)
MMMMfebruari
y5 (årtal utan årtusendet)
yy05 (årtal utan årtusendet, om årtalet är mindre än 10 skrivs en nolla ut framför)
yyyy2005
ggA.D. (Anno Domini, tidsåldern vi befinner oss i)
hh11 (timslaget i 12-timmarsintervall)
HH23 (timslaget i 24-timmarsintervall)
mm12 (minut under en timme)
ss36 (sekund under en minut)
f(tiondel av en sekund, använd ”s f” som formatmönstret)
ff(hundradel av en sekund, använd ”s ff” som formatmönstret)
fff(tusendel av en sekund, använd ”s fff” som formatmönster)
 (finns i upp till sex decimaler)
ttPM (om exempelvis en-GB, Storbritanniens datumstandard används. AM eller PM)
zz+01 (vår tidszonskompensation)
:standardseparatorn för tid (22:12)
/standardseparatorn för datum (8/2)
% c(används om man vill skriva ett extra formatmönster i formatmönstret.)
\ c(används om man vill skriva text och inte mönster, i formatmönstret, exempelvis \kl HH:mm för att skriva kl 22:12)

Att tänka på


När jag tidigare har programmerat så har datumhanteringen nästan alltid orsakat problem. Bra saker att tänka på när man jobbar med datum i ASP.NET är att använda rätt datatyp. Så länge du inte behöver skriva ut datumet på en sida – låt datatypen vara av typen datetime. När du behöver skriva ut datumet – konvertera då datumet till en sträng genom att använda toString()-metoden:

lbl1.text = dt.toString()
Du kan även som ett alternativ använda cStr() när du exempelvis inte behöver formatera dina datum. För er som kodar C# kan det vara vetvärt att cStr() är en VB-specifik funktion. Den finns alltså inte i C#. Däremot finns toString()-metoden i C#.

lbl1.text = cStr(dt)
Förhoppningsvis ger nu denna artikel dig den information du behöver för att kunna formatera dina datum som du vill ha dem. Testa dig fram och lycka till!