fout weeknummer

Status
Niet open voor verdere reacties.

Frenske123

Terugkerende gebruiker
Lid geworden
2 jul 2007
Berichten
1.267
Hallo

Ik kom nogal wat scripts tegen die het juiste weeknummer in kalender niet weergeven ,

zoals dit:
(week 48 ipv week 49)

iemand een oplossing ??
Code:
  <SCRIPT Language="JavaScript">
<!--

function weekNo() {
  var totalDays = 0;  		
  now = new Date();
  years=now.getYear()
  if (years < 1000)
  years+=1900
  var days = new Array(12);	
  days[0] = 31;
  days[2] = 31;
  days[3] = 30;
  days[4] = 31;
  days[5] = 30;
  days[6] = 31;
  days[7] = 31;
  days[8] = 30;
  days[9] = 31;
  days[10] = 30;
  days[11] = 31;



   if (Math.round(now.getYear()/4) == now.getYear()/4) {
     days[1] = 29
  }else{
     days[1] = 28
  }



  if (now.getMonth() == 0) {		
     totalDays = totalDays + now.getDate();
  }else{
     var curMonth = now.getMonth();
     for (var count = 1; count <= curMonth; count++) {
         totalDays = totalDays + days[count - 1];
     }
     totalDays = totalDays + now.getDate();
   }
   var week = Math.round(totalDays/7);
   return week;
}
document.write('<CENTER><B><FONT FACE="Verdana" SIZE="2">Welkom in <b>Week '+weekNo()+'<\/b> van '+years+'!</FONT></CENTER></B>')

// -->
</SCRIPT>
 
Laatst bewerkt door een moderator:
Weken beginnen op maandag (of zondag), en dat is niet altijd de eerste dag van het jaar. Dit kan dus niet: Math.round(totalDays/7);

Daarnaast rond Math.round() af naar het dichtstbijzijnde hele getal, dus ook naar boven. Dat is niet juist aangezien de 6e dag van een week nog steeds in die week zit. Los van het feit dat weken op maandag beginnen moet je dus niet Math.round() gebruiken maar Math.floor().

Maargoed, er zijn vast wel scripts op het internet die het goede weeknummer bij een dag van een willekeurig jaar vinden, het is alleen net iets te gecompliceerd om even uit je mouw te schudden. Je moet in ieder geval rekening houden met het fout dat de eerste week van een jaar de week is met de eerste donderdag van dat jaar. Begint een jaar op een vrijdag, dan is dat nog de laatse week van het vorige jaar. Begint een jaar op een dinsdag dan begon de eerste week van het jaar dus op 31 december van het vorige jaar. De complete cyclus van weken in jaren herhaalt zich elke 400 jaar.

Nog iets, een schikkeljaar is inderdaad elke 4 jaar, behalve op een eeuw-wisseling, en juist weer wel elke 400 jaar.

Dit geeft dus onterecht aan dat het een schikkeljaar is in 2100 en 1900 (2000 is wel een schikkeljaar, en 1600 en 2400 ook):
Code:
if (Math.round(now.getYear()/4) == now.getYear()/4) {
  days[1] = 29
}else{
  days[1] = 28
}

Dat moet zo:
Code:
var cur_year = now.getYear();
if ((year % 400 == 0) || (year % 100 !=0 && year % 4 == 0))
{
  days[1] = 29
}
else
{
  days[1] = 28
}
 
Laatst bewerkt:
weeknummer

Hallo Glest


Bedankt !! voor je uitleg en de genomen moeite.:thumb:


Als ik bovenstaande code vervang zoals je aangaf werkt het script helaas niet meer
bij mij

var week = Math.round(totalDays/7); dit kon niet volgens jou , mischien hier nog iets aanpassen??
 
Laatst bewerkt:
woopsie, ik had year geschreven in plaats van cur_year. De schrikkeljaar-check moet dus zo:

Code:
var cur_year = now.getFullYear();
if (([COLOR="Red"][B]cur_[/B][/COLOR]year % 400 == 0) || ([COLOR="Red"][B]cur_[/B][/COLOR]year % 100 !=0 && [COLOR="Red"][B]cur_[/B][/COLOR]year % 4 == 0))
{
  days[1] = 29
}
else
{
  days[1] = 28
}

Tja, een weeknummer is lastig aangezien de cyclus zich elke 400 jaar herhaalt. Maar ik zal er morgen naar kijken, want het moet kunnen (zonder een array voor 400 jaar :p)
 
Laatst bewerkt:
Ok, ik geloof dat dit werkt. Je kunt dan het weeknummer van een datum opvragen op deze manier:

PHP:
var date = new Date();
alert(date.getWeek());


Houdt er wel rekening mee dat dit in de lokale tijdzone is van de bezoeker. Wil je het in een specifieke tijdzone dan moet je het even zeggen. Dit is de code die je ergens uit het zicht kunt plakken. Als je het in een extern JS bestandje zet, zorg dan wel dat dit script eerder geladen wordt dan een ander script wat hier gebruik van moet maken.

PHP:
function is_leap_year(year)
{
  return (year % 400 == 0 || (year % 100 != 0 && year % 4 == 0));
}

function days_in_month(month, year)
{
  switch(month)
  {
  case  1:
  case  3:
  case  5:
  case  7:
  case  8:
  case 10:
  case 12:
    return 31;
  case 4:
  case 6:
  case 9:
  case 11:
    return 30;
  case 2:
    return is_leap_year(year) ? 29 : 28;
  default:
    return 0;
  }
}



Date.prototype.getWeek = function()
{
  var last_december31		 = new Date(this.getFullYear()-1, 11, 31);
  var next_january1		 = new Date(this.getFullYear()+1, 0, 1);
  var last_december31_weekday	 = ((last_december31.getDay()+6) % 7) + 1;
  var next_january1_weekday	 = ((next_january1.getDay()+6) % 7) + 1;
  var first_week_starts		 = 0-last_december31_weekday;
  if (first_week_starts <= -4)
    first_week_starts		+= 7; 

  var day_of_year	 = this.getDate()-1;
  for (var i=this.getMonth(); i > 0; i--)
    day_of_year		+= days_in_month(i, this.getFullYear());

  var days_since_start	 = day_of_year - first_week_starts;
  var weeknumber	 = Math.floor(days_since_start / 7) + 1;

  if (weeknumber == 0)
  {
    return last_december31.getWeek();
  }

  if (weeknumber == 53 && next_january1_weekday <= 4)
    weeknumber		 = 1;

  return weeknumber;
}
 
Laatst bewerkt:
weeknummer

Mischien ligt het aan mij , maar ik krijg het niet werkend

Kun je mischien een de volledige code posten , of was bovenstaande dit!!

Wederom Bedankt!! ;)
 
dat was het ja, bij mij werkt het. Zolang alle drie de functie maar gedefineerd zijn moet het werken. Zet dit anders in een script op een lege pagina. Dit moet zoiezo werken:

PHP:
function is_leap_year(year)
{
  return (year % 400 == 0 || (year % 100 != 0 && year % 4 == 0));
}

function days_in_month(month, year)
{
  switch(month)
  {
  case  1:
  case  3:
  case  5:
  case  7:
  case  8:
  case 10:
  case 12:
    return 31;
  case 4:
  case 6:
  case 9:
  case 11:
    return 30;
  case 2:
    return is_leap_year(year) ? 29 : 28;
  default:
    return 0;
  }
}



Date.prototype.getWeek = function()
{
  var last_december31		 = new Date(this.getFullYear()-1, 11, 31);
  var next_january1		 = new Date(this.getFullYear()+1, 0, 1);
  var last_december31_weekday	 = ((last_december31.getDay()+6) % 7) + 1;
  var next_january1_weekday	 = ((next_january1.getDay()+6) % 7) + 1;
  var first_week_starts		 = 0-last_december31_weekday;
  if (first_week_starts <= -4)
    first_week_starts		+= 7; 

  var day_of_year	 = this.getDate()-1;
  for (var i=this.getMonth(); i > 0; i--)
    day_of_year		+= days_in_month(i, this.getFullYear());

  var days_since_start	 = day_of_year - first_week_starts;
  var weeknumber	 = Math.floor(days_since_start / 7) + 1;

  if (weeknumber == 0)
  {
    return last_december31.getWeek();
  }

  if (weeknumber == 53 && next_january1_weekday <= 4)
    weeknumber		 = 1;

  return weeknumber;
}

for (var i = 2000; i <= 2012; i++)
{
  document.write(i+": "+new Date(i, 0, 1).getWeek()+"<br />\n");
}


Bij mij komt dit er uit:
2000: 52
2001: 1
2002: 1
2003: 1
2004: 1
2005: 53
2006: 52
2007: 1
2008: 1
2009: 1
2010: 53
2011: 52
2012: 52
 
weeknummer

ik zie helaas niets

Mischien dat je het eens compleet kunt plaatsen zoals het script wat ik in het begin heb geplaatst.( weeknummer met tekst)

bedankt
 
Het is een compleet script :confused:

Maargoed, als je er html bij wilt:
PHP:
<html>
<head>
<script type="text/javascript">
function is_leap_year(year)
{
  return (year % 400 == 0 || (year % 100 != 0 && year % 4 == 0));
}

function days_in_month(month, year)
{
  switch(month)
  {
  case  1:
  case  3:
  case  5:
  case  7:
  case  8:
  case 10:
  case 12:
    return 31;
  case 4:
  case 6:
  case 9:
  case 11:
    return 30;
  case 2:
    return is_leap_year(year) ? 29 : 28;
  default:
    return 0;
  }
}



Date.prototype.getWeek = function()
{
  var last_december31         = new Date(this.getFullYear()-1, 11, 31);
  var next_january1         = new Date(this.getFullYear()+1, 0, 1);
  var last_december31_weekday     = ((last_december31.getDay()+6) % 7) + 1;
  var next_january1_weekday     = ((next_january1.getDay()+6) % 7) + 1;
  var first_week_starts         = 0-last_december31_weekday;
  if (first_week_starts <= -4)
    first_week_starts        += 7; 

  var day_of_year     = this.getDate()-1;
  for (var i=this.getMonth(); i > 0; i--)
    day_of_year        += days_in_month(i, this.getFullYear());

  var days_since_start     = day_of_year - first_week_starts;
  var weeknumber     = Math.floor(days_since_start / 7) + 1;

  if (weeknumber == 0)
  {
    return last_december31.getWeek();
  }

  if (weeknumber == 53 && next_january1_weekday <= 4)
    weeknumber         = 1;

  return weeknumber;
}

for (var i = 2000; i <= 2012; i++)
{
  document.write(i+": "+new Date(i, 0, 1).getWeek()+"<br />\n");
}  
</script>
</head>
<body>
</body>
</html>
 
weeknummer

Ok dat heb ik , maar script dat ik als eerste plaatste , dat geeft toch iets anders weer.

hier was dus alleen weeknummer fout , hoe krijg ik dit nu met juiste nummer,moet ik een gedeelte hiermee vervangen mischien?? ;)
 
Mijn script voegt een functie toe aan het Date() object. Als je er dus voor zorgt dat mijn script eerder wordt gedraaid dan een script waar je het week nummer wilt hoef je alleen maar de functie van het datum object aan te roepen.

stel dat de variable date je Date() object is, dan roep je gewoon deze functie:
Code:
date.getWeek()
 
weeknummer

Sorry maar kom er niet bepaald uit


Dit wil ik :


Welkom in week 49


Hoe zou de de code in pagina er dan uitzien



nou krijg ik dit:

2000: 52
2001: 1
2002: 1
2003: 1
2004: 1
2005: 53
2006: 52
2007: 1
2008: 1
2009: 1
2010: 53
2011: 52
2012: 52

bedankt
 
Daarvoor hoef je alleen de laatse regels van het script te weizigen. Vervang dit:
PHP:
for (var i = 2000; i <= 2012; i++)
{
  document.write(i+": "+new Date(i, 0, 1).getWeek()+"<br />\n");
}

Door dit:

PHP:
document.write("Welkom, het is nu week <strong>"+new Date().getWeek()+"</strong>");
 
Laatst bewerkt:
Hallo Glest,


Bedankt voor de (grote) genomen moeite , het is nu compleet !!!:thumb:
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan