php.de

Zurück   php.de > Webentwicklung > HTML, Usability und Barrierefreiheit

HTML, Usability und Barrierefreiheit Themen rund um Textauszeichnung, Formatierung, Barrierefreiheit und Usability.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 01.11.2007, 11:23  
Erfahrener Benutzer
 
Registriert seit: 13.05.2006
Beiträge: 466
Curanai ist zur Zeit noch ein unbeschriebenes Blatt
Standard JavaScript: 01.01.07 bis 31.12.07 = 334 Tage???

Moinsen z'amme,

entweder liegt es an meinem Rechner, dass ich hier vermehrt ins Forum posten muß oder der DAU an der Tastatur ist selbst schuld. ^^

Ich bitte um Hilfe für ein eigentlich simples Problem mit folgendem Code:

Wir haben mal das hier ...
Code:
var Datum1 = document.parameter.start.value.split(".");
var Datum2 = document.parameter.end.value.split(".");
Natürlich ist eine vollständige Prüfung auf Schaltjahr etc. erfolgt ... und damit geht es weiter ...

Code:
var year1 = eval(Datum1[2]); var month1 = eval(Datum1[1]); var day1 = eval(Datum1[0]);
var year2 = eval(Datum2[2]); var month2 = eval(Datum2[1]); var day2 = eval(Datum2[0]);
Kein Kommentar erforderlich, oder? ... weiter geht's ...

Code:
var anfangsdatum = new Date();
anfangsdatum.setDate(day1);
anfangsdatum.setMonth(--month1);
anfangsdatum.setFullYear(year1);
		
var enddatum = new Date();
enddatum.setDate(day2);
enddatum.setMonth(--month2);
enddatum.setFullYear(year2);
		
var diff = enddatum.getTime() - anfangsdatum.getTime();
var days = Math.round(diff / (1000 * 60 * 60 * 24));
alert(days);
Soooooo ... genau ... ich habe nix anderes vor als zwei Daten miteinander zu vergleichen und davon eine Ableitung zu machen, wieviel Tage bis dato verstreichen müssen.

Jetzt mal das "kuriose":
Wer bei obigem Modell "01.01.2007" und "31.12.2007" eingibt, müsste EIGENTLICH 365 erhalten, oder? JavaScript unterschlägt mir aber satte 31 Tage und sagt "334" ...

Nehme ich den 30.12.2007 stimmt es ...

Ähnliches Phänomen bei etwas wie "15.02.2007" und "31.03.2007". Aus dem 31.03. macht er mir einen 01.03. ...

Frage: Sollte ich weniger Trinken? *lach* ... nein ... wo ist mein Denkfehler bzw. an was stört der sich?

Danke fürs Feedback!!!!
__________________
Manche Menschen sind wie Schnitzel - nicht zäh, aber beidseitig bekloppt!
Curanai ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 01.11.2007, 11:45  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Du hast einen schweren Seiteneffekt beim Setzen des Datums:
Schau dir speziell mal an, wie dein enddatum zustande kommt! Hier verwendest du das aktuelle Datum (new Date), also den 1. November, setzt den Monatstag (31.12.2007 -> 31), damit bist du beim 31. November 2007. Dieses Datum gibt es nicht, also wird der Überhang in den nächsten Monat übernommen, der 1. Dezember 2007 entsteht. Jetzt setzt du (unerheblich) Monat und Jahr auf schon zufällig zustande gekommenen Dezember 2007 und deine Fehlberechnung ist perfekt

Übrigens spuckt die Verwendung von eval() bei mir Fehler aus und was document.parameter ist weiß ich auch nicht (Frame?), hab deshalb alles etwas umgefrickelt. Ich denke den Fehler kannst du mit Blick auf die Datumsfunktionen selbst ausbessern (Tipp: Date-Konstruktor):
http://de.selfhtml.org/javascript/objekte/date.htm

Code:
<html>
<head>
<script>
function foobar()
{
var Datum1 = document.getElementById("start").innerHTML.split(".");//document.parameter.start.value.split(".");
var Datum2 = document.getElementById("end").innerHTML.split(".");//document.parameter.end.value.split(".");

var year1 = parseInt(Datum1[2],10); var month1 = parseInt(Datum1[1],10); var day1 = parseInt(Datum1[0],10);
alert("start: " + year1 + "-" + month1 + "-" + day1);

var year2 = parseInt(Datum2[2],10); var month2 = parseInt(Datum2[1],10); var day2 = parseInt(Datum2[0],10);
alert("end: " + year2 + "-" + month2 + "-" + day2);

var anfangsdatum = new Date();
anfangsdatum.setDate(day1);
anfangsdatum.setMonth(month1 - 1);
anfangsdatum.setFullYear(year1);
alert("start: " + anfangsdatum.toGMTString());

var enddatum = new Date();
alert("end (init): " + enddatum.toGMTString());
enddatum.setDate(day2);
alert("end (day set): " + enddatum.toGMTString());
enddatum.setMonth(month2 - 1);
alert("end (month set): " + enddatum.toGMTString());
enddatum.setFullYear(year2);
alert("end (year set): " + enddatum.toGMTString());

var diff = enddatum.getTime() - anfangsdatum.getTime();
alert(diff / (1000 * 60 * 60 * 24));
var days = Math.round(diff / (1000 * 60 * 60 * 24));
alert(days);
}
</script>
</head>
<body>

<div id="start">01.01.2007</div>
<div id="end">31.12.2007</div>
<button onclick="foobar()">go</button>

</body>
</html>
Ich hoffe die Seite hier inspiriert dich für die Zukunft, selbst etwas zu debuggen, ist nicht schwer
Zergling-new ist offline   Mit Zitat antworten
Alt 01.11.2007, 11:58  
Erfahrener Benutzer
 
Registriert seit: 13.05.2006
Beiträge: 466
Curanai ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hallo Zergling,

danke für den "Tipp", aber bei Deinem Modell kommt in der Box ...

Code:
alert("end (year set): " + enddatum.toGMTString());
... auch Sat, 01 Dec 2007, [Uhrzeit] ... kurz: 334 Tage (sogar mit Nachkommastellen)

Mit der Datumserklärung bin ich auch nicht konform - denn schließlich werden alle Parameter gesetzt - ich setze ja nicht nur den Tag.

document.parameter ist das Eingabeform, worüber die Werte kommen, was hier im Beispiel nicht von Nöten war.
__________________
Manche Menschen sind wie Schnitzel - nicht zäh, aber beidseitig bekloppt!
Curanai ist offline   Mit Zitat antworten
Alt 01.11.2007, 12:16  
Erfahrener Benutzer
 
Registriert seit: 13.05.2006
Beiträge: 466
Curanai ist zur Zeit noch ein unbeschriebenes Blatt
Standard

BTW: Es gibt eine Erweiterung für Joomla, die auch damit Probleme hat - so O-Ton aus Österreich ...

Jetzt mal hierzu folgendes, was mir aufgefallen ist:

01.01.2007 - 30.05.2007 = 149 Tage ... korrekt!

01.01.2007 - 31.05.2007 = 120 Tage ... falsch!

Das sieht mir eher nach einem "inneren" Problem aus ...



EDIT:
Nebenbei: PHP berechnet es richtig ... ! (mittels mktime probiert)
__________________
Manche Menschen sind wie Schnitzel - nicht zäh, aber beidseitig bekloppt!
Curanai ist offline   Mit Zitat antworten
Alt 01.11.2007, 13:10  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Nein du hast mich falsch verstanden, ich habe nichts verbessert, lediglich ein paar Debug-Ausgaben eingefügt, damit das Problem nachvollziehbarer wird. Aber gut, nochmal erklärt, warum beim 30./31. dieser Effekt auftritt:

Zitat:
Code:
var enddatum = new Date();
enddatum.setDate(day2);
enddatum.setMonth(--month2);
enddatum.setFullYear(year2);
Dieser Teil scheint richtig zu sein, ist es aber nicht!
Wir gehen davon aus, dass day2=31, month2=12, year2=2007 ist.

Zeile 1: Du erstellst ein neues Datum. Ohne Parameter verwendet new Date() das aktuelle, also 1. November 2007, 13:05 Uhr.
Zeile 2: Du setzt den Tag, die Zahl, 31 (day2) als Monatstag ein. Daraus entsteht durch simple Ersetzung der 31. November 2007, 13:05 Uhr. Der 31. November existiert nicht, da der November nur 30 Tage hat. Der eine Tag überhang wird auf den 30. November addiert, das heißt der Folgetag genommen. Es entsteht der 1. Dezember 2007, 13:05 Uhr. Jetzt setzt du noch Monat (12 minus 1) und Jahr (2007), welches aber bereits auf Dezember und 2007 eingestellt sind (keine Wirkung). Jede einzelne Operation scheint für sich richtig, ist es in seiner Gesamtheit aber nicht.
Ganz einfach könntest du das Problem lösen, in dem du zuerst das Jahr, dann den Monat und als letztes den Tag setzt. Das hätte folgenden Ablauf:

Jahr setzen: Aus 1. November 2007, 13:08 Uhr wird der 1. November 2007, 13:08 Uhr (keine Änderung).
Monat setzen: Aus 1. November 2007, 13:08 Uhr wird der 1. Dezember 2007, 13:08 Uhr.
Tag setzen: Aus 1. Dezember 2007, 13:08 Uhr wird der 31. Dezember 2007, 13:08 Uhr.
Durch die Vertauschung des Setzvorgangs kannst du also die Richtigkeit garantieren.

Ich würde trotzdem alles in einem Wisch machen, und das Datum mit new Date(Jahr, Monat, Tag, Stunden, Minuten, Sekunden); setzen, ist einfach kompakter und richtiger
Zergling-new ist offline   Mit Zitat antworten
Alt 01.11.2007, 14:12  
Erfahrener Benutzer
 
Registriert seit: 13.05.2006
Beiträge: 466
Curanai ist zur Zeit noch ein unbeschriebenes Blatt
Standard

AHHHRG ... ich sterbe gerade den Heldentod!!! *lol*

Sorry, da habe ich Dich A) wirklich fehlinterpretiert ... und B) "kann-doch-wohl-nicht-sein-ey!" ...

DANKE ... ich sollte vielleicht was anderes machen ... "Politiker" z. B. Die denken auch immer viel zu kompliziert, obwohl es sooo simpel ist.

*verzweifel und krise hier krieg*

Danköööööö.
__________________
Manche Menschen sind wie Schnitzel - nicht zäh, aber beidseitig bekloppt!
Curanai ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
JS: Einführung - Javascript im Schichtenmodell nikosch Tutorials 4 11.04.2009 17:06
Lange Verarbeitungszeiten - Zuviel JavaScript? [-UFO-]Melkor HTML, Usability und Barrierefreiheit 2 15.06.2007 23:54
PHP + Javascript + MYSQL socke PHP Tipps 2006 4 02.04.2006 22:02
Variable wird geändert bei Übergabe an Javascript PHP Tipps 2007 4 17.12.2005 16:53
[Erledigt] Javascript Aufklappen/Zuklappen HTML, Usability und Barrierefreiheit 5 13.12.2005 14:06
Javascript durch PHP ausdrücken PHP Tipps 2007 10 09.11.2005 20:04
2 javascript fragen Rotti HTML, Usability und Barrierefreiheit 4 03.08.2005 11:40
[Erledigt] JavaScript &amp; PHP (Bilderupload) PHP-Fortgeschrittene 5 11.07.2005 17:08
[Erledigt] NewWindow mit JavaScript - Vor-Zurück Button automatisch ? HTML, Usability und Barrierefreiheit 0 10.07.2005 15:43
Php soll Javascript beschleunigen PHP Tipps 2005 4 17.04.2005 12:56
[Erledigt] JavaScript +mehrereFenster HTML, Usability und Barrierefreiheit 5 03.02.2005 15:08
Formulare mit arrays mit php und gleichzeitig mit JavaScript PHP-Fortgeschrittene 2 14.10.2004 15:33
JavaScript in JavaScript geschriebene Html-Datei einbinden. woods HTML, Usability und Barrierefreiheit 6 06.09.2004 18:33
Javascript HTML, Usability und Barrierefreiheit 5 31.08.2004 18:30
php + Javascript, Variablenübergabe PHP Tipps 2004 14 28.07.2004 15:42

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
datumsrechner javascript, javascript datumsrechner, datumsrechner java, javascript monatstag, mysql datumsrechner, java script tagesrechner, datumsrechner php, datumsrechner java script, javascript november 31 tage, datumsrechner monate tage, javascript new date dezember, js gettime mktime stimmt nicht, php datumsrechner code, javascript monatstage, tagerechner javascript, javascript tage zwischen zwei daten, javascript aktuelles datum minus tage, wieviele tage 01.01 bis 31.05, javascript date setzt das datum falsch, tage rechner java script

Alle Zeitangaben in WEZ +2. Es ist jetzt 03:15 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.