• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

[GELÖST] Ermittlung Tag des Jahres

mikdoe

Moderator
Guten Morgen!

Im Netz habe ich diesen Codeschnipsel gefunden:
HTML:
function dayofyear(dateobj) {
	var timestmp = new Date().setFullYear(dateobj.getFullYear(),0,1);
	var yearFirstDay = Math.floor(timestmp/86400000);
	var today = Math.ceil((dateobj.getTime())/86400000);
	return (today-yearFirstDay+1);
}

Ist das noch state of the art und performant oder kann man das noch optimieren? Eine JS oder jQuery Onboard Funktion dafür konnte ich nicht finden.
 
Zuletzt bearbeitet:
Hi,
hast du dies mal getestet? Bin da nicht sicher ob dies für alle Fälle funktioniert, wenn mit fixen Zeiten für den Tag (86400000) gerechnet wird.
Stichpunkt Sommer/Winterzeit.

LG jspit
 
Die bisherigen Tests waren korrekt. Soweit ich weiß rechnet das Date Objekt doch in UTC Unix Epoch, oder? Dann sind Sommer-/Winterzeit eigentlich neutralisiert. Oder liege ich da falsch?
 
Der Timestamp ist immer Unix-Time, doch dein Input ist doch sicher eine Localzeit?
Für ein reines Datum

Code:
tag = dayofyear(new Date('2012/06/31'));  //183

wird das wohl abgefangen, Probleme gibt es wenn eine Zeit mitkommt:
Code:
tag = dayofyear(new Date('2012/06/31 23:01'));  //184

Wenn das dir reicht, würde ich da nicht weiter 'optimieren'.

LG jspit
 
Und damit auch nichts passieren kann, wenn der Kalender um 23 Uhr aufgerufen wird habe ich ein setHours(0,0,0); eingefügt für das lokale Date Objekt.
HTML:
function dayofyear(dateobj) {
	var localdateobj = new Date(dateobj);
	localdateobj.setHours(0,0,0);
	var timestmp = new Date().setFullYear(localdateobj.getFullYear(),0,1);
	var yearFirstDay = Math.floor(timestmp/86400000);
	var today = Math.ceil((localdateobj.getTime())/86400000);
	return (today-yearFirstDay+1);
}
 
Hab hier noch was gefunden, sieht etwas schicker aus:
Code:
Date.prototype.getDOY = function() {
  var onejan = new Date(this.getFullYear(),0,1);
  return Math.ceil((this - onejan) / 86400000);
}

Selbst nicht getestet. Würde mich mal interessieren ob die ok ist, wenn du das nehmen möchtest.

Zählt ab 0. Auf der Basis würde ich auch die Woche machen.
 
Zuletzt bearbeitet:
jspit, damit habe ich aber auch das Sommer-/Winterzeitproblem:
HTML:
Date.prototype.getDOY = function() {
  var onejan = new Date(this.getFullYear(),0,1);
  return Math.ceil((this - onejan) / 86400000);
}
var test = new Date('2012/06/31 23:01');
console.log(test.getDOY());
Ergibt 183 statt 182
 
Ich müsste da aber zwingend ein .setHours(0,0,0) unterbringen, sonst schlägt dein Testbeispiel fehl. Hab es versucht, klappte aber nicht. Lieferte nichts zurück, nichts in der Fehlerkonsole.
 
Ich würde sowas immer auf 12 Uhr mittags stellen...

Hab' einen Code, der keine Rundung o.Ä. braucht:
Code:
	Date.prototype.getDayOfYear = function(){
		var temp = new Date(this.getTime());
		temp.setHours(12, 0, 0, 0);
		var time = temp.getTime();
		temp.setUTCMonth(0, 0);
		var refTime = temp.getTime();
		return (time - refTime) / (24 * 60 * 60 * 1000);
	};
	Date.prototype.setDayOfYear = function(dayOfYear){
		this.setDate(
			this.getDate() + dayOfYear - this.getDayOfYear()
		);
	};
 
Zuletzt bearbeitet:
Hab' einen Code, der keine Rundung o.Ä. braucht:
Ohne Rundung? Wirklich?:
HTML:
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<div id="test"></div>
<script>
Number.prototype.fix = function(radix) {
	// Quelle: http://forum.jswelt.de/javascript/57908-richtig-runden.html#post368772
	if(!radix) radix = 0;
	return (parseInt(parseInt(this * Math.pow(10, radix +1) + 5)/10)/Math.pow(10, radix)).toFixed(radix);
};
Date.prototype.getDayOfYear = function(){
	var temp = new Date(this.getTime());
	temp.setHours(12, 0, 0, 0);
	var time = temp.getTime();
	temp.setMonth(0, 0);
	var refTime = temp.getTime();
	return (time - refTime) / (24 * 60 * 60 * 1000);
};
function gib_datum(dateobj,r) {
	var tag = dateobj.getDate();
	if (tag < 10) { tag = '0'+tag; }
	var monat = dateobj.getMonth()+1;
	if (monat < 10) { monat = '0'+monat; }
	var jahr = dateobj.getFullYear();
	return (r ? jahr+''+monat+''+tag : tag+'.'+monat+'.'+jahr);
}
var datum = new Date('2019/12/31');
var erwartet = 0;
for (var i = 0; i < 365; i++) {
	datum.setDate(datum.getDate()+1);
	var doy = datum.getDayOfYear();
	erwartet ++;
	if (erwartet != doy) {
		document.getElementById('test').innerHTML += gib_datum(datum)+' falsch erwartet: '+erwartet+' erhalten: '+doy+' kaufm. gerundet sieht es besser aus: '+doy.fix(0)+'<br>';
	}
}
</script>
</body>
</html>
29.03.2020 falsch erwartet: 89 erhalten: 88.95833333333333 kaufm. gerundet sieht es besser aus: 89
30.03.2020 falsch erwartet: 90 erhalten: 89.95833333333333 kaufm. gerundet sieht es besser aus: 90
31.03.2020 falsch erwartet: 91 erhalten: 90.95833333333333 kaufm. gerundet sieht es besser aus: 91
01.04.2020 falsch erwartet: 92 erhalten: 91.95833333333333 kaufm. gerundet sieht es besser aus: 92
.
.
.
.
.
.
und so weiter bis 24.10.2020, danach passt es dann wieder
 
Zurück
Oben