webForumDet fria alternativet

Vecka + år

13 svar · 520 visningar · startad av J.N.

J.N.Medlem sedan apr. 20031 660 inlägg
#1

HEJ!

Jag letar efter ett javscript som har två dropdowns, ett med år, ett med vecka. När du byter år, ändras vecko-dd också, eftersom vissa år har 53 veckor, tex i år.

De script som jag hittat på wF skriver ut datum + tid, men det är jag alltså inte ute efter.

JojoxxMedlem sedan juni 20004 308 inlägg
#2

Exempel:

<script type="text/javascript">
Date.prototype.getWeek=function(){
	var nywd=(new Date(this.getFullYear(),0,1).getDay()==0)?7:new Date(this.getFullYear(),0,1).getDay();
	var w=Math.ceil((this.getTime()+nywd*86400000-new Date(this.getFullYear(),0,1).getTime())/(604800000))
	if(nywd>4){w--;}
	if(w==0){ return new Date(this.getFullYear()-1,11,31).getWeek()}
	if(w==53 && new Date(this.getFullYear()+1,0,1).getDay()<=4){w=1}
	return w
}
function updateweeks(obj){
	var d=new Date(obj.year[obj.year.selectedIndex].text,0,1); var lastw=false;
	obj.week.length=0;
	for(var n=0;new Date(d.getTime()+n).getFullYear()==d.getFullYear();n+=86400000){
		if(lastw!=new Date(d.getTime()+n).getWeek()){ lastw=new Date(d.getTime()+n).getWeek(); obj.week[obj.week.length]=new Option(lastw,lastw); }
	}
}
window.onload=function(){ updateweeks(document.myform); }
</script>
<form name="myform">
<select name="year" onchange="updateweeks(this.form);"><option>2004</option><option>2005</option><option>2006</option></select>
<select name="week"></select>
</form>
J.N.Medlem sedan apr. 20031 660 inlägg
#3

HEJ!

Tack, men nästan rätt, den visar v53 och v1 först och sist i vissa läge, men jag ska se om jag kan åtgärda det.

JojoxxMedlem sedan juni 20004 308 inlägg
#4

Första veckan på året (1 januari) kan vara v 52 eller 53. Det beror på vilken veckodag som nyårsdagen infaller på. Titta i en kalender så ser du. (Samma sak gäller nyårsafton, 31 december).

J.N.Medlem sedan apr. 20031 660 inlägg
#5

HEJ!

Jo, att det finns 53 veckor på vissa år är jag med på, det är det som det befintliga vb-scriptet inte förstår...

Okej, jag är med, denna funktion visar alltså alla veckor som finns på ett år!
Jag trodde först att den inte rensade bort alla värde ur dropdownen utan att v53 låg kvar och skräpade...

Tack för hjälpen, då återstår för mig att inkludera den i befintlig kod, vilket inte blir alldeles enkelt.

J.N.Medlem sedan apr. 20031 660 inlägg
#6

HEJ!

Fortsätter på samma tråd, även om den är "klar".

Vid närmre eftertanke har jag kommit på att kunden inte klarar av att den visar alla veckor på ett år, dvs den ska alltid börja på ett.

Det lättaste sättet att lösa detta på är alltså att loopa 1 till veckor, där veckor då är 52 eller 53.
Frågan är alltså hur man får reda på om ett år har 52 eller 53 veckor?

Vill också ersätta årtalsutskriften med js-kod som loopar från ar-1 till ar+2.

JojoxxMedlem sedan juni 20004 308 inlägg
#7
function updateweeks(obj){
	var d=new Date(obj.year[obj.year.selectedIndex].text,0,1); var lastw=0;
	obj.week.length=0;
	for(var n=0;new Date(d.getTime()+n).getFullYear()==d.getFullYear();n+=86400000){
		if(new Date(d.getTime()+n).getWeek()==lastw+1){ lastw=new Date(d.getTime()+n).getWeek(); obj.week[obj.week.length]=new Option(lastw,lastw); }
	}
}

Jag antar att det är samma sak i slutet av året, att om sista december infaller vecka 1 skall den inte vara med.

J.N.Medlem sedan apr. 20031 660 inlägg
#8

HEJ!

Perfekt!

Försöker skicka in aktuell datum i din funktion för att välja rätt vecka, och det fungerar om jag hårdkodar det, men inte annars.

Jag har en OnLoad som skickar dagens datum i javascriptform (dvs 2004, 02, 23; gjort replace på - mot ,) men när jag tar emot den i funktionen verkar det som att det inte är ett datum, utan en sträng?

Har läst igenom alla datumfunktioner, men tydligen har jag missat något!

function updateweeks(obj,idag){
	//var idag= new Date(2003, 04, 04) <- fungerar
	ELLER
	//var idag= new Date(idag)  <- fungerar ej!

	var d = idag.getFullYear()
	var lastw=0;
	obj.week.length=0;
	for(var n=0;new Date(d.getTime()+n).getFullYear()==d.getFullYear();n+=86400000){
		if (new Date(d.getTime()+n).getWeek()==lastw+1){
			lastw=new Date(d.getTime()+n).getWeek();
			if (thisweek == lastw){
				obj.week[obj.week.length]=new Option(lastw,lastw,true,true);
			}
			else{
				obj.week[obj.week.length]=new Option(lastw,lastw);
			}
		}
	}
}

Har testat sätta ihop idag med idag = new Date(idag.getFullYear(), idag.getMonth(), idag.getDate()), men det går inte!

Vad gör jag fel på?

JojoxxMedlem sedan juni 20004 308 inlägg
#9
function updateweeks(obj){
	var d=new Date(obj.year[obj.year.selectedIndex].text,0,1); var lastw=0;
	var now=new Date(new Date().getFullYear(),new Date().getMonth(),new Date().getDate());
	obj.week.length=0;
	for(var n=0;new Date(d.getTime()+n).getFullYear()==d.getFullYear();n+=86400000){
		if(new Date(d.getTime()+n).getWeek()==lastw+1){ lastw=new Date(d.getTime()+n).getWeek(); obj.week[obj.week.length]=new Option(lastw,lastw); }
		if(new Date(d.getTime()+n).getTime()==now.getTime()){ obj.week.selectedIndex=obj.week.length-1; }
	}
}

J.N. skrev:

//var idag= new Date(idag) <- fungerar ej!

Skickar du bara med ett värde till Date() så betyder det antal millisekunder sedan 1/1-1970 00:00:00. Prova:

alert(new Date(5000));
J.N.Medlem sedan apr. 20031 660 inlägg
#10

HEJ!

Tack för all hjälp!

Misstänkte att den minskade 2004-02-23 med varandra, men kan man alltså inte få Date.parse att känna igen 2004, 02, 23 som "that is recognized by the Date.parse method"?

I vilket fall räknar jag om mha datediff från 1/1-70 till aktuell datum och skickar in den som millisek, fungerar!

Nästa problem:

Det är inte veckonumret som ska vara option i dd, utan måndagens datum. Hur får man ut måndagen ur veckan alltså?

function updateweeks(obj,millisek){
	var d=new Date(obj.year2(obj.year2.selectedIndex).text,0,1); var lastw=0;
	var thisweek = new Date(millisek).getWeek()
	obj.week.length=0;
	for(var n=0;new Date(d.getTime()+n).getFullYear()==d.getFullYear();n+=86400000){
		if(new Date(d.getTime()+n).getWeek()==lastw+1){
			lastw=new Date(d.getTime()+n).getWeek();
			obj.week[obj.week.length]=new Option(now.getFullYear() + "-" + now.getMonth() + "-" + now.getDay(),lastw);
		}
		if(lastw == thisweek){
			obj.week.selectedIndex=obj.week.length-1;
		}
	}
}

Aktuell kod ger samma hela tiden, givetvis. (Bytt plats på dem för test.)
När jag började tänka på vad jag ville göra insåg jag att det inte var alldeles enkelt, år är ju oftast ett mindre v1.

JojoxxMedlem sedan juni 20004 308 inlägg
#11

now definieras som "just nu" och ändras alltså inte i loopen. Så istället för now.getFullYear() använder du new Date(d.getTime()+n).getFullYear() osv.

J.N.Medlem sedan apr. 20031 660 inlägg
#12

HEJ!

Då var det fixat, det var ju inte så jobbigt :e

Den slutgiltiga koden för att välja år+vecka till en rumsbokningssida blev:

<script type="text/javascript">
Date.prototype.getWeek=function(){
	var nywd=(new Date(this.getFullYear(),0,1).getDay()==0)?7:new Date(this.getFullYear(),0,1).getDay();
	var w=Math.ceil((this.getTime()+nywd*86400000-new Date(this.getFullYear(),0,1).getTime())/(604800000))
	if(nywd>4){w--;}
	if(w==0){ return new Date(this.getFullYear()-1,11,31).getWeek()}
	if(w==53 && new Date(this.getFullYear()+1,0,1).getDay()<=4){w=1}
	return w
}

//J.N. 24/2-04: Känd 'bugg': Om väljer 2004-v53, sedan annat år, blir det v1, v53 finns ej. Bryr mig ej om det.
function updateweeks(obj,millisek){
	var d=new Date(obj.S_YEAR[obj.S_YEAR.selectedIndex].text,0,1); var lastw=0;
	//två rader för test var now=new Date(millisek); alert(now)
	var thisweek = new Date(millisek).getWeek()
	//alert(thisweek)
	obj.FRW.length=0;
	for(var n=0;new Date(d.getTime()+n).getFullYear()==d.getFullYear();n+=86400000){
		if(new Date(d.getTime()+n).getWeek()==lastw+1){
			lastw=new Date(d.getTime()+n).getWeek();
			
			var manad = (new Date(d.getTime()+n).getMonth() + 1);
			if (manad < 10) manad = 0 + "" + manad //sätt dit 0
			var dag = new Date(d.getTime()+n).getDate()
			if (dag < 10) dag = 0 + "" + dag //sätt dit 0
			obj.FRW[obj.FRW.length]=new Option(lastw,new Date(d.getTime()+n).getFullYear() + "-" + manad + "-" + dag);
		}
		if(lastw == thisweek){
			obj.FRW.selectedIndex=obj.FRW.length-1;
		}
	}
}

function writeyears(obj,millisek){
	var thisyear = new Date(millisek).getFullYear()
	var fromyear = thisyear - 1
	var stopyear = thisyear + 5;
	obj.S_YEAR.length = 0;
	for(year = fromyear; year < stopyear; year++){
		obj.S_YEAR[obj.S_YEAR.length]=new Option(year,year);
		if (thisyear == year){
			obj.S_YEAR.selectedIndex=obj.S_YEAR.length-1;
		}
	}
	updateweeks(obj,millisek);
}
</script>

Kallas via:
<body ... OnLoad="writeyears(document.myform,<%=DateDiff("S","1970-01-01",idag)*1000%>);">

'idag' är måndagen i aktuell vecka, förutom vid årsskifte, då är det den 1/1 på nya året. 

<form name="myform">
År: <select name="S_YEAR" OnChange="updateweeks(this.form,<%=DateDiff("S","1970-01-01",idag)*1000%>);"></select>
Vecka: <select name="FRW"></select>
</form>

Sista frågan:
Veckorna fungerar inte i Mozilla. Jag har kommit fram till att det beror på

var d=new Date(obj.S_YEAR(obj.S_YEAR.selectedIndex).text,0,1);

alert((obj.S_YEAR.selectedIndex).text)
ger 'undefined' som resultat

alert(obj.S_YEAR.selectedIndex)
fungerar däremot.

/red: Bytt () mot []

JojoxxMedlem sedan juni 20004 308 inlägg
#13

Var nog lite trött när jag gjorde det där :) Så här skall det vara;

var d=new Date(obj.year[obj.year.selectedIndex].text,0,1);
J.N.Medlem sedan apr. 20031 660 inlägg
#14

HEJ!

Du har helt rätt, och det är förståeligt om du var trött efter alla dessa rader med javascript!

Däremot borde ju jag kunnat lista ut det själv, det är ju ingen syntax jag inte sett tidigare! x(

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