webForumDet fria alternativet

formatera datum

14 svar · 519 visningar · startad av plelkes

plelkesMedlem sedan mars 2002823 inlägg
#1

Hej, nu visas sidan nästan som jag vill, men jag är inte nöjd med datumformateringen..
Vill att det skall vara "svensk-formatering" typ:

skrivet: 03-04-03 kl 20:30

Sidans nuvarande

<html>
<head>
<title>g&amp;auml;stbok</title>
<meta http-equiv=Content-Type content=text/html; charset=iso-8859-1>
</head>

<p align=center><font size=7><b><i><font color=#FFCC33>V&auml;lkommen till 
  skolans g&auml;stbok</font></i></b></font></p>
 
<%  dim minCon 'Connection
     dim rsGbok 'recordsetten f&ouml;r nya inl&auml;gg
     dim strSQL

Set minCon = Server.CreateObject("ADODB.Connection")
set rsGbok = Server.CreateObject("ADODB.Recordset")

minCon.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("\plelkes\db\guests.mdb")
strSQL =" SELECT * FROM guestbook ORDER by ID DESC"
rsGbok.Open strSQL, minCon, 3, 3
Do While Not rsGbok.EOF
Response.Write "Skrivet den: " & rsGbok("Datum")
Response.Write "   av: " & rsGbok("Namn") & "<BR>"
Response.Write "Min E-postadress är: " & rsGbok("Epost") & "<BR>"
Response.Write "Mitt inlägg: <BR>"
Response.Write rsGbok("Message")
Response.Write  "<P><HR><P>"

  rsGbok.MoveNext
  Loop
  rsGbok.Close
  Set rsGbok = Nothing
  minCon.Close
  Set minCon = Nothing
  %>
</body>
</html>

Tacksam för hjälp (med förklaring) hur jag kan få till detta..
Som ni ser så finns sidan på brinkster.

VideMedlem sedan dec. 19998 577 inlägg
#2

Lägg till:
Session.LCID = 1053
längst upp på sidan.

Möjligtvis behöver du även formatera datumet med cdate() också om det inte funkar.

plelkesMedlem sedan mars 2002823 inlägg
#3

Vide, dit förslag fungerade kanonbra!
Men jag skulle villja kunna formatera lite bättre..
Nu får jag

2003-03-21 19:33:42

Men jag skulle villja ha typ

onsdagen den 9 april, 2003

Med kodsnutten

dim indag
Session.LCID = 1053 
dim indag

indag=WeekDayName(WeekDay(Now()))&"en den "&Day(Now())& " " & MonthName(Month(Now()))& ", " & Year(Now())
Response.Write indag

får jag fram dagens datum formaterad som jag vill, men nu vill jag har

rsGbok("Datum")

formaterad på det sättet då jag hämtar från databasen

OveRRidEMedlem sedan feb. 200112 078 inlägg
plelkesMedlem sedan mars 2002823 inlägg
#5

Tack för ditt svar OveRRidE , men jag får fortfarande inte ihop det hela

FormatDateTime(Date[, NamedFormat])
Arguments
Date
Required. Date expression to be formatted.

Så jag försökte med följande:

rsGbok("Datum")=indag ' rsGbok("Datum") är ju "Date expr" som skall formateras
dat =WeekDayName(WeekDay(indag()))&"en  "&
_FormatDateTime(indag, 1) 
dat =WeekDayName(WeekDay(indag()))&"en  "& FormatDateTime(indag, 1) 
Do While Not rsGbok.EOF
Response.Write dat
Response.Write "Skrivet den: " & rsGbok("Datum")
Response.Write "   av: " & rsGbok("Namn") & "<BR>"
Response.Write "Min E-postadress är: " & rsGbok("Epost") & "<BR>"
Response.Write "Mitt inlägg: <BR>"
Response.Write rsGbok("Message")
Response.Write  "<P><HR><P>"

  rsGbok.MoveNext

  Loop
  rsGbok.Close
  Set rsGbok = Nothing
  minCon.Close
  Set minCon = Nothing
  %>

Funkar ej - får felutskrift:

Microsoft VBScript runtime error '800a000d'

Type mismatch

/plelkes/gastboken.asp, line 26

@ndersMedlem sedan juni 200032 969 inlägg
#6

På vänster sida variabel, på höger sida värde. Dessutom måste du se till att konvertera värden från databas till rätt subtyp, i det här fallet subtypen datum (enligt Vides inlägg.).

indag = CDate(rsGbok("Datum"))

Mvh

plelkesMedlem sedan mars 2002823 inlägg
#7

Tack Anders,,,
men! ju mera jag håller på med asp dessto mindre fattar jag*snyft*

Du skrev

Dessutom måste du se till att konvertera värden från databas till rätt subtyp

Varför det? Kan du förklara det på ren svenska, tack

plelkesMedlem sedan mars 2002823 inlägg
#8

får fanskapet fortfarande inte att fungera!! [KOD]<% dim minCon 'Connection
dim rsGbok 'recordsetten för nya inlägg
dim strSQL

dim indag, dat
Session.LCID = 1053

Set minCon = Server.CreateObject("ADODB.Connection")
set rsGbok = Server.CreateObject("ADODB.Recordset")

minCon.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("\plelkes\db\guests.mdb")
strSQL =" SELECT * FROM guestbook ORDER by ID DESC"
rsGbok.Open strSQL, minCon, 3, 3
indag = Cdate(rsGbok("Datum"))
dat = WeekDayName(WeekDay(indag))&"en "& FormatDateTime(indag, 1)
Do While Not rsGbok.EOF

Response.Write "Inlägget nedan skrevs " & dat
Response.Write " av: " & rsGbok("Namn") & "<BR>"
Response.Write rsGbok("Namn") & " har E-postadressen : " & rsGbok("Epost") & "<BR>"
Response.Write "<B><U>Mitt inlägg: </U></B><BR>"
Response.Write rsGbok("Message")
Response.Write "<P><HR><P>"

rsGbok.MoveNext

Loop
rsGbok.Close
Set rsGbok = Nothing
minCon.Close
Set minCon = Nothing
%>

plelkesMedlem sedan mars 2002823 inlägg
#9

får fanskapet fortfarande inte att fungera!!

<% dim minCon 'Connection
dim rsGbok 'recordsetten f&ouml;r nya inl&auml;gg
dim strSQL

dim indag, dat
Session.LCID = 1053 

Set minCon = Server.CreateObject("ADODB.Connection")
set rsGbok = Server.CreateObject("ADODB.Recordset")

minCon.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("\plelkes\db\guests.mdb")
strSQL =" SELECT * FROM guestbook ORDER by ID DESC"
rsGbok.Open strSQL, minCon, 3, 3
indag = Cdate(rsGbok("Datum"))
dat = WeekDayName(WeekDay(indag))&"en "& FormatDateTime(indag, 1) 
Do While Not rsGbok.EOF

Response.Write "Inlägget nedan skrevs " & dat
Response.Write " av: " & rsGbok("Namn") & "<BR>"
Response.Write rsGbok("Namn") & " har E-postadressen : " & rsGbok("Epost") & "<BR>"
Response.Write "<B><U>Mitt inlägg: </U></B><BR>"
Response.Write rsGbok("Message")
Response.Write "<P><HR><P>"

rsGbok.MoveNext

Loop
rsGbok.Close
Set rsGbok = Nothing
minCon.Close
Set minCon = Nothing
%>
@ndersMedlem sedan juni 200032 969 inlägg
#10

I VBScript finns inga datatyper, utan alla värden är av typen variant. Däremot finns olika subtyper, exempelvis tal, sträng och datum. De flesta funktioner i VBScript kräver att det värdet de tar emot är av en viss subtyp. Därför måste man göra en subtypskonvertering innan man använder funktionen. Datumfunktioner (Year(), Month(), DateAdd(), DatePart(), FormatDateTime() etc) kräver sålunda att värdet de tar emot är av datumtyp. Det ser man till genom att använda CDate() (Convert to Date).

Andra typkonverteringsfunktioner är exempelvis:
CStr() - till sträng
CInt() - till integer (heltal upp till 32k)
CLng() - till long (lång heltal, kan vara hyggligt stort)
CDate() - till datum
CDbl() - till double (decimaltal)
etc.

Det är framför allt värden som kommer från databas eller textfil/dylikt som måste subtypskonverteras innan användning. Om man själv skapar variablerna och dess värden i koden , kan man se till att de är typade till rätt modell redan från början.

dteMittDbDatum = objRs("datum") ' här har vi hämtat ut datumet
dteMittDbDatum = CDate(dteMittDbDatum) ' nu är variabeln konverterat till rätt subtyp och kan användas i datumfunktioner

På motsvarande sätt måste du ofta konvertera värden till taltyp om du ska räkna med dem, annars riskerar du att 3+4 blir 34.

På vilket sätt fungerar det inte? "Det fungerar inte" är en dålig felbeskrivning och gör det svårt att berätta varför det inte fungerar. Dock:
* Du har tilldelningen av dat utanför loopen, den kommer inte ändras per inlägg
* Jag gissar på att utskriften av WeekDayName(WeekDay(indag))& "en "& FormatDateTime(indag, 1) blir galen. Använd i så fall inte både WeekdayName() och FormatDateTime().

Hoppas det blev lite klarare.

m_soderlundMedlem sedan sep. 20026 425 inlägg
#11

Jag känner att jag inte behöver bidra med så mycket mer till ämnet, men jag kände också att @nders gav ett enormt utförligt och bra svar. Tummen upp för @nders! (Jag var bara tvungen..)

plelkesMedlem sedan mars 2002823 inlägg
#12

Tack @nders, mycket klarare. Utmärkt förklarat! Till och med jag förstår...

På vilket sätt fungerar det inte? "Det fungerar inte" är en dålig felbeskrivning och gör det svårt att berätta varför det inte fungerar.

Det som inte fungerar är att det blir dagens datum som skrivs ut. Även efter de ändringar du föreslog!!!

@ndersMedlem sedan juni 200032 969 inlägg
#13

plelkes skrev:

Tack @nders, mycket klarare. Utmärkt förklarat! Till och med jag förstår...

Toppen! :)

Bara för att vara säker på att du förstod hur jag menade kodmässigt, så flyttar jag på två rader, och ändrar en aning. Prova detta:

<% dim minCon 'Connection
dim rsGbok 'recordsetten för nya inlägg
dim strSQL

dim indag, dat
Session.LCID = 1053 

Set minCon = Server.CreateObject("ADODB.Connection")
set rsGbok = Server.CreateObject("ADODB.Recordset")

minCon.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("\plelkes\db\guests.mdb")
strSQL =" SELECT * FROM guestbook ORDER by ID DESC"
rsGbok.Open strSQL, minCon, 3, 3
Do While Not rsGbok.EOF
[b]indag = Cdate(rsGbok("Datum"))
dat = FormatDateTime(indag, 1) [/b]

Response.Write "Inlägget nedan skrevs " & dat
Response.Write " av: " & rsGbok("Namn") & "<BR>"
Response.Write rsGbok("Namn") & " har E-postadressen : " & rsGbok("Epost") & "<BR>"
Response.Write "<B><U>Mitt inlägg: </U></B><BR>"
Response.Write rsGbok("Message")
Response.Write "<P><HR><P>"

rsGbok.MoveNext

Loop
rsGbok.Close
Set rsGbok = Nothing
minCon.Close
Set minCon = Nothing
%>

Man kan också förenkla de två fetmarkerade raderna till följande, om man så önskar:

dat = FormatDateTime(Cdate(rsGbok("Datum")), 1)

Jag hoppas att det blev någon skillnad, och då också till det bättre. ;)

Mvh

plelkesMedlem sedan mars 2002823 inlägg
#14

@anders du är en klippa, hellt enkelt bäst!!
Nu Funkar allt som jag vill det
Här kommer

<%  dim minCon 'Connection
     dim rsGbok 'recordsetten f&ouml;r nya inl&auml;gg
     dim strSQL

dim indag, dat
Session.LCID = 1053 

Set minCon = Server.CreateObject("ADODB.Connection")
set rsGbok = Server.CreateObject("ADODB.Recordset")

minCon.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("\plelkes\db\guests.mdb")
strSQL =" SELECT * FROM guestbook ORDER by ID DESC"
rsGbok.Open strSQL, minCon, 3, 3
Do While Not rsGbok.EOF
indag = Cdate(rsGbok("Datum"))
dat = WeekDayName(WeekDay(indag))&"en "& FormatDateTime(indag, 1) 
Response.Write "Inlägget nedan skrevs " & dat
Response.Write "   av: " & rsGbok("Namn") & "<BR>"
Response.Write rsGbok("Namn") & " har E-postadressen : " & rsGbok("Epost") & "<BR>"
Response.Write "<B><U>Mitt inlägg: </U></B><BR>"
Response.Write rsGbok("Message")
Response.Write  "<P><HR><P>"

  rsGbok.MoveNext

  Loop
  rsGbok.Close
  Set rsGbok = Nothing
  minCon.Close
  Set minCon = Nothing
  %>

Men som vanligt så uppstår det nya följdfrågor:

  • varför funkar allt nu när Du har tilldelningen av dat och "dat = WeekDayName(WeekDay(indag))&"en "& FormatDateTime(indag, 1)" finns i loopen
@ndersMedlem sedan juni 200032 969 inlägg
#15

Om du har de två raderna utanför loopen innebär det:
* Värdet (dvs datumet från fältet Datum i recordsetet) hämtas från den första raden i recordsetet. Alltså den senaste posten eftersom du valt den sorteringsordningen i din SQL-fråga. Den posten råkar alltså ha dagens datum.
* Värdet ändras inte heller just av anledningen att koden ligger utanför loopen. Så: en gång 9 april, alltid 9 april. ;)

En liten metafor: Du ställer du utanför Posten i Svedmyra och en gammal dam närmar sig entrédörren. Du sträcker dig givetvis för att öppna dörren för damen. När damen gått in, släpper du dörren, och inser att du även ska öppna den för den gamla farbrorn som kommer. Och för mamman med barnvagnen.

Det är helt enkelt vissa saker som måste upprepas för att allting ska vara optimalt. Visst hade farbrorn kunnat öppna dörren själv, men han hade antagligen inte gjort det på rätt sätt, eftersom han hade en väska och en käpp. ;)

Lägg dörröppningen i loopen, och var så vänlig att hålla upp dörren för alla i den långa kön. :D

Mvh,

135 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)