webForumDet fria alternativet

Skottår

ASP

23 svar · 1 346 visningar · startad av Organick

Medlem sedan okt. 200120 inlägg
Frågan#1

Hvordan laver jeg min kalender til at klare at regne ud hvornår det er skottår?

Function getMonth(monthNr)

	Select Case monthNr
		Case 1 manad = "Januari"
		Case 2 manad = "Februari"
		Case 3 manad = "Mars"
		Case 4 manad = "April"
		Case 5 manad = "Maj"
		Case 6 manad = "Juni"
		Case 7 manad = "Juli"
		Case 8 manad = "Augusti"
		Case 9 manad = "September"
		Case 10 manad = "Oktober"
		Case 11 manad = "November"
		Case 12	manad = "December"
	End Select
	
	getMonth = manad
	
End Function

Function getDays(monthNr)

	Select Case monthNr
		Case 1 days = 31
		Case 2 days = 28
		Case 3 days = 31
		Case 4 days = 30
		Case 5 days = 31
		Case 6 days = 30
		Case 7 days = 31
		Case 8 days = 31
		Case 9 days = 30
		Case 10 days = 31
		Case 11 days = 30
		Case 12	days = 31
	End Select
	
	getDays = days
	
End Function
Medlem sedan dec. 20025 483 inlägg
#2

Så här skulle jag vilja göra:

Function isLeapYear()
 y = Year(Date())
 isLeapYear = (y mod 4 = 0 And (y mod 100 <> 0 Or y mod 400 = 0)) * -1
End Function

Function getDays(monthNr)

	Select Case monthNr
		Case 1 days = 31
		Case 2 days = 28 + [B]isLeapYear()[/B]
		Case 3 days = 31
		Case 4 days = 30
		Case 5 days = 31
		Case 6 days = 30
		Case 7 days = 31
		Case 8 days = 31
		Case 9 days = 30
		Case 10 days = 31
		Case 11 days = 30
		Case 12	days = 31
	End Select
	
	getDays = days
	
End Function

Är dock litet osäker på huruvida det fetstilta typkonverteras till ett numeriskt värde (1 eller 0).

Medlem sedan okt. 200120 inlägg
#3

Fungerer ikke

Det fungerer ikke rigtigt. Nu kommer kun datoerne 1,2,3 og alle kommer under mandag, resten bliver ikke vist, når jeg går til f.eks februar 2008. Hvad kan det skyldest?

Medlem sedan dec. 20025 483 inlägg
#4

Det verkar som att True typkonverteras till -1. Jag har därför redigerat mitt förra inlägg till att ta hänsyn till det. Ett snabbt test verkar visa att det fungerar.

Medlem sedan okt. 200120 inlägg
#5

Fungerer hellere ikke

Takk for hjælpen.

Jeg får den samme fejl. Den viser bare datoerne 1,2,3 og bliver sorteret under mandag. Jeg viser bare hele koden, hvis det kan hjælpe dig bedre.

<%
Function getMonth(monthNr)

	Select Case monthNr
		Case 1 manad = "Januari"
		Case 2 manad = "Februari"
		Case 3 manad = "Mars"
		Case 4 manad = "April"
		Case 5 manad = "Maj"
		Case 6 manad = "Juni"
		Case 7 manad = "Juli"
		Case 8 manad = "Augusti"
		Case 9 manad = "September"
		Case 10 manad = "Oktober"
		Case 11 manad = "November"
		Case 12	manad = "December"
	End Select
	
	getMonth = manad
	
End Function

Function isLeapYear()
 y = Year(Date())
 isLeapYear = (y mod 4 = 0 And (y mod 100 <> 0 Or y mod 400 = 0)) * -1
End Function

Function getDays(monthNr)

	Select Case monthNr
		Case 1 days = 31
		Case 2 days = 28 + isLeapYear()
		Case 3 days = 31
		Case 4 days = 30
		Case 5 days = 31
		Case 6 days = 30
		Case 7 days = 31
		Case 8 days = 31
		Case 9 days = 30
		Case 10 days = 31
		Case 11 days = 30
		Case 12	days = 31
	End Select
	
	getDays = days
	
End Function

Function getNext(s)
' s = sign (eg +,-)
' am = aktuell månad
' ay = aktuellt år
	
	If s = "+" Then
		If mm = 12 Then
			am = 1
			ay = yyyy + 1
		Else
			am = mm + 1
			ay = yyyy
		End If
	Else
		If mm = 1 Then
			am = 12
			ay = yyyy - 1
		Else
			am = mm - 1
			ay = yyyy
		End If
	End if
	
	getNext = am & "&y=" & ay
	
End Function

' Plocka fram aktuellt datum
datum	= Date
aManad 	= Month(datum)
aDag	= Day(datum)
aAr		= Year(datum)

' Vilken månad skall visas?
If Request.QueryString("m") <> "" Then
	mm 		= Request.QueryString("m")
	yyyy 	= Request.QueryString("y")
Else
	mm 		= Month(datum)
	yyyy 	= Year(datum)
End If

' Hur många rutor skall skippas första veckan?
skip 	=  DatePart("w", mm & "/1-"&yyyy, vbMonday) - 1

%>

<SCRIPT LANGUAGE="javascript">
<!--
function popup(url,width,height)
{
	unik=new Date();
	unik=unik.getSeconds()+"_"+unik.getMinutes()+"_"+unik.getHours();
	stuff = "toolbar=no,menubar=no,scrollbars=yes,resizable=no,width= " +width + ", height = " +height
	window.open(url , unik , stuff );
}
//-->
</SCRIPT>

<table width="175" border="0" cellspacing="0" cellpadding="1">
  <tr> 
    <td bgcolor="#999999"> 
      <table width="175" border="0" cellspacing="0" cellpadding="1" bgcolor="#FFFFFF">
        <tr bgcolor="#CCCCCC"> 
          <td width="25"> 
            <div align="center"><font size="1" face="Verdana, Arial, Helvetica, sans-serif">M&aring;</font></div>
          </td>
          <td width="25"> 
            <div align="center"><font size="1" face="Verdana, Arial, Helvetica, sans-serif">Ti</font></div>
          </td>
          <td width="25"> 
            <div align="center"><font size="1" face="Verdana, Arial, Helvetica, sans-serif">On</font></div>
          </td>
          <td width="25"> 
            <div align="center"><font size="1" face="Verdana, Arial, Helvetica, sans-serif">To</font></div>
          </td>
          <td width="25"> 
            <div align="center"><font size="1" face="Verdana, Arial, Helvetica, sans-serif">Fr</font></div>
          </td>
          <td width="25"> 
            <div align="center"><font size="1" face="Verdana, Arial, Helvetica, sans-serif">L&ouml;</font></div>
          </td>
          <td width="25"> 
            <div align="center"><font size="1" face="Verdana, Arial, Helvetica, sans-serif">S&ouml;</font></div>
          </td>
        </tr>
        <%
		set Rs = Server.CreateObject("ADODB.Recordset") 
		RS.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.Mappath("kalender.mdb") 
		RS.Source = "Select DISTINCT(dd) From handelser Where mm = " & mm & " And yyyy = " & yyyy & " Order By dd"
		RS.Open()

		dag = 1 - skip 
		x = 0 
		Do Until x > (getDays(mm) + skip) / 7 

			Response.Write "<tr>" 

			For y = 1 To 7 

				bgColor = "#FFFFFF" 
				If not RS.EOF Then 
					If int(dag) = int(RS("dd")) Then 
						bgColor = "#CCCCCC" 
						skriv = "true"
						
						'RS.MoveNext 
					End If 
				End If
				
				If aDag&aManad&aAr = dag&mm&yyyy Then
					bgColor = "#FFCCCC"
				End If

				If dag > 0 AND dag < getDays(mm)+1 Then 
					borderColor = "#999999" 
				Else 
					borderColor = "#FFFFFF" 
				End If 

				Response.Write "<td width='25'>" 
				Response.Write "<table width = '100%' border='0' cellspacing='0' cellpadding='1' bgcolor='" &borderColor &"'>"_ 
						& "<tr><td>" 
				Response.Write "<table width = '100%' border='0' cellspacing='0' cellpadding='1' bgcolor='" & bgColor & "'>"_ 
						& "<tr><td>" 

				Response.Write "<div align='center'><font size='1' face='Verdana, Arial, Helvetica, sans-serif'>" 

				If dag > 0 And dag < getDays(mm)+1 Then 
					If skriv = "true" Then
						Response.Write "<a href='javascript:popup(""visa_dag.asp?dd=" & dag & "&mm=" & mm & "&yy=" & yyyy & """,330,200);'>" & dag & "</a>"
						RS.MoveNext
						skriv = "false"
					Else
						Response.Write dag
					End if
				End If 

				Response.Write "</font></div></td></tr></table></td></tr></table></td>" 

				dag = dag + 1 

			Next 
			Response.Write "</tr>" 

			x = x + 1 
		Loop 

		RS.Close() 
		%>
        <tr bgcolor="#CCCCCC"> 
          <td width="25" bgcolor="#CCCCCC"> 
            <div align="center"><a href="kalendar.asp?m=<%=getNext("-")%>"><img src="left.gif" width="15" height="10" border="0"></a></div>
          </td>
          <td colspan="5"> 
            <div align="center"><font size="1" face="Verdana, Arial, Helvetica, sans-serif"> 
              <%Response.Write "<b>" & getMonth(mm) & " (" & yyyy & ")</b>"%>
              </font></div>
          </td>
          <td width="25"> 
            <div align="center"><a href="kalendar.asp?m=<%=getNext("+")%>"><img src="right.gif" width="15" height="10" border="0"></a></div>
          </td>
        </tr>
      </table>
    </td>
  </tr>
  <tr>
    <td bgcolor="#FFFFFF"><font face="Verdana, Arial, Helvetica, sans-serif" size="1"><a href="administrera.asp">ADMIN</a></font> 
    </td>
  </tr>
</table>
Medlem sedan dec. 20003 887 inlägg
#6

Lösningen är väl att skriva om funktionen så att den returnerar det som förväntas...

function isLeapYear()
  dim intYear

  intYear = year( date() )

  isLeapYear = ( intYear mod 4 = 0 and ( y mod 100 <> 0 or y mod 400 = 0 ) ) * -1

  if ( isLeapYear ) then
    isLeapYear = 1
  else
    isLeapYear = 0
  end if

end function
Medlem sedan dec. 20025 483 inlägg
#7

Vad returnerade den innan omskrivningen då?

Medlem sedan juni 200032 967 inlägg
#8

... kan också vara vettigt att låta funktionen ta emot årtalet, så man faktiskt kan använda den till andra år än det aktuella. :)

mvh

Medlem sedan dec. 20003 887 inlägg
#9

Peter S skrev:

Vad returnerade den innan omskrivningen då?

VBScripts version av true/false...

-1 = true
everything else = false

Medlem sedan okt. 200120 inlägg
#10

Det fungerer ikke. Nu viser den 28 dage i februrar unansett årstal, det skal vise 29 dage februrar 2008. Hvad kan det skyldes?

function isLeapYear()
  dim intYear

  intYear = year( date() )

  isLeapYear = ( intYear mod 4 = 0 and ( y mod 100 <> 0 or y mod 400 = 0 ) ) * -1

  if ( isLeapYear ) then
    isLeapYear = 1
  else
    isLeapYear = 0
  end if

end function

Function getDays(monthNr)

	Select Case monthNr
		Case 1 days = 31
		Case 2 days = 28 + isLeapYear
		Case 3 days = 31
		Case 4 days = 30
		Case 5 days = 31
		Case 6 days = 30
		Case 7 days = 31
		Case 8 days = 31
		Case 9 days = 30
		Case 10 days = 31
		Case 11 days = 30
		Case 12	days = 31
	End Select
	
	getDays = days
	
End Function
Medlem sedan juni 200032 967 inlägg
#11

Hvad kan det skyldes?

Det beror på att leapyear-funktionen inte tar emot aktuellt år, utan bara använder det år som är just nu. 2006 är ju inte ett skottår.

function isLeapYear(intYear)
  isLeapYear = ( intYear mod 4 = 0 and ( intYear mod 100 <> 0 or intYear mod 400 = 0 ) ) * -1

  if ( isLeapYear ) then
    isLeapYear = 1
  else
    isLeapYear = 0
  end if

end function

Sedan måste du skicka med året i kallet till funktionen:

iLeapDay = isLeapYear(2008)

Istället för 2008 skickar du enklast in ett variabelt värde för året du söker, och sedan lägger du till iLeapDay till antalet februaridagar.

mvh

Medlem sedan dec. 20025 483 inlägg
#12
y -> intYear
Medlem sedan juni 200032 967 inlägg
#13

(Mitt inlägg är redigerat efter Peters korrigeringsförslag)

mvh

Medlem sedan maj 200010 687 inlägg
#14

Varför inte bara skriva så här?

Function getDays(monthNr)
	getDays = Day(DateSerial(Year(Now), monthNr + 1, 0))
End Function
Medlem sedan dec. 20025 483 inlägg
#15

Erik Juhlin skrev:

Varför inte bara skriva så här?

En anledning kan vara inkompetens.

Red./ Detta gäller alltså ej Anders, Engine^ och Organick.

Medlem sedan juni 200032 967 inlägg
#16

Erik Juhlin skrev:

Varför inte bara skriva så här?

Bra fråga. :)
Mycket snyggare. Jag skyller på att... hmm... jag vet inte jag.

(y)

Medlem sedan dec. 20003 887 inlägg
#17

Erik Juhlin skrev:

Varför inte bara skriva så här?

Jag skyller på @nders... :)

Medlem sedan okt. 200120 inlägg
#18

Først 1000 takk for hjælpen.

Den virkede med at sætte iLeapDay = IsLeapYear(2008)

Medlem sedan dec. 20025 483 inlägg
#19

Organick skrev:

Først 1000 takk for hjælpen.

Den virkede med at sætte iLeapDay = IsLeapYear(2008)

Kanon! Jag föreslår att du postar din fullständiga lösning och använder funktionen acceptera som slutgiltigt svar på det inlägget.

Medlem sedan okt. 200120 inlägg
#20

Jeg troede at den funktion virkede, det var noget med min cache som gjorde at den ikke virkede. Den eneste funktion jeg får at fungere, er:

Function getDays(monthNr)

	Select Case monthNr
		Case 1 days = 31
		Case 2
			if yyyy = 2008 then
				days = 29
			else
				days = 28
			end if
		Case 3 	days = 31
		Case 4 	days = 30
		Case 5 	days = 31
		Case 6 	days = 30
		Case 7 	days = 31
		Case 8 	days = 31
		Case 9 	days = 30
		Case 10 days = 31
		Case 11 days = 30
		Case 12	days = 31
	End Select
	
	getDays = days
	
End Function

Hvordan gør jeg at 2012 2016....osv. bliver udskiftet med 2008?

269 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
128 ms — deklarationer (db)
0 ms — hämta statistik (cache)
139 ms — hämta tråd, inlägg och bilagor (db)
118 ms — ändringar (db)