JS gibt nicht richtigen Monat zurück?

4 Antworten

  • Januar: 0
  • Februar: 1
  • März: 2
  • April: 3
  • Mai: 4
  • Juni: 5
  • Juli: 6
  • August: 7
Woher ich das weiß:Hobby – Programmieren ist mein Hobby & Beruf

RANGObro 
Beitragsersteller
 28.08.2021, 02:15

Wer hat sich das denn so kacke ausgedacht? Ich meine Tage sind auch normal. Zumindest krieg ich mit d.getDate 28

0
MrAmazing2  28.08.2021, 02:19
@RANGObro

Tja, ist leider bis auf die Tage alles 0-based.

Der JavaScript-Entwickler hat damals die Date-Klasse einfach von Java kopiert. Und da war das leider so blöd gemacht. Und seitdem wurde es nie geändert weil es sicher eine Menge kaputt machen würde.

0
RANGObro 
Beitragsersteller
 28.08.2021, 02:20
@MrAmazing2

Hm weird dass mir das noch nie aufgefallen ist

0
wunschname0302  28.08.2021, 02:26
@RANGObro

Im Grunde ist es egal - als Informatiker liest man die Specs, ohne irgendwas hineinzuinterpetieren. Auf developer.mozilla.org steht: "The getMonth() method returns the month in the specified date according to local time, as a zero-based value (where zero indicates the first month of the year)."

3
Von Experte MrAmazing2 bestätigt

Vermutlich, ich weiss es in diesem Fall nicht, weil üblicherweise ab Null gezählt wird.


RANGObro 
Beitragsersteller
 28.08.2021, 02:14

Du meinst der Monat wird 0-11 angegeben? Ich hab halt einfach mal auf StackOverflow nach der Funktion geguckt und da war es richtig und der Tag wird auch ab 1 gezählt

0

Der numerische Wert des Monats wird bei JS beginnend mit 0=Januar angegeben.

Gruß an POSIX und struct_time.

Nachtrag:

Der Grund ist eigentlich banal:

11 +1 %12 =0 Auf 11 (Dezember) folgt 0 (Januar).

Würde ich ab 1 zählen wollen, wird der Ausdruck deutlich ekliger. Folgerichtig wird bei POSIX auch der Tag des Jahres ab 0(=1. Januar) gezählt.


MagisterSamael  28.08.2021, 03:30
Würde ich ab 1 zählen wollen, wird der Ausdruck deutlich ekliger.

Nö, ist exakt das Gleiche:

(12+1)%12=1 Auf 12 (Dezember) folgt 1 (Januar).

Aber netter (falscher) Erklärungsversuch :)

0
MagisterSamael  28.08.2021, 04:10
@MagisterSamael

Natürlich habe ich einen Fehler gemacht.

Ich meinte:

12%12+1=1 Auf 12 (Dezember) folgt 1 (Januar)

Wir dürfen natürlich hier erst nach der Restdivision eins hinzu addieren.

Ist nicht exakt das Gleiche, aber auch nicht eklig und nicht sonderlich schwerer.

0
MagisterSamael  28.08.2021, 04:49
@KarlRanseierIII

Entweder ist deine Aufgabenstellung etwas falsch gestellt und beinhaltet nicht alle nötigen Informationen oder du hast dein eigenes Konzept nicht richtig verstanden.

Wie wäre es, wenn du es mir mit einem (deinem) Beispiel erläuterst. Als dritte Möglichkeit möchte ich meine eigene Dummheit nicht ausschließen.

0
MagisterSamael  28.08.2021, 05:01
@KarlRanseierIII

Ich hoffe ich habe deine Aufgabenstellung korrekt verstanden, ansonsten solltest du an deiner Ausdrucksweise arbeiten...

Beginnen wir mit diesem Monat in diesem Jahre:

August -> 8. Monat

Berechnung der Jahre:

Math.floor(711/12) = 59

Berechnung der Restmonate:

711%12 = 3

Berechnung der Gesamtmonate:

8+3 = 11

Berechnung des Jahrs:

2021+59 = 2080

Monatsberechnung verkürzt:

711%12+8 = 11

Jahresberechnung verkürzt:

Math.floor(711/12)+2021 = 2080

Somit haben wir den 11. Monat im Jahr 2080.

Sprich: November 2080.

Deckt sich mit dieser Seite:

https://rechneronline.de/termin/monate.php

Keine Ahnung was das mit der ursprünglichen Formel zutun hat, da diese hier mitnichten vorkommt, aber wenn es dich befriedigt.

0
KarlRanseierIII  28.08.2021, 05:22
@MagisterSamael

Okay, ich habe ein Datum der Monat sei m, das Jahr y.. 711 Monate weiter:

m=(m+711) %12 - Das geh nicht nur für 711 sondern immer gut, solange m=0 dem Januar entspricht.

y+=711//12 - //=Ganzzahldivision

-----

Sagen wir nun mal, wir nehmen nun 157 Monate, der Januar entspreche 1 und wir haben Dezember.

157 % 12 ist 1, wir addieren, landen bei 13.

0
MagisterSamael  28.08.2021, 05:32
@KarlRanseierIII

Gut, natürlich müssen wir von einer Überschreitung ausgehen. Dann fügen wir einfach eine erneute Restdivision an und sind auf der sicheren Seite:

157%12+12%12

Immernoch nicht sonderlich "ekliger".

So geht das auch immer gut, egal von welchem Monat wir ausgehen.

Die Grundaussage ist dennoch falsch. Das ist nicht der Grund.

Punkt.

0
KarlRanseierIII  28.08.2021, 05:59
@MagisterSamael

12%12 ist 0 ;-).

(157%12+12)%12 ginge, allerdings nicht mehr, wenn November ist, weil das dann zu 0 führt, also undefiniert.

Alternativ verschiebt man vorher und nachher die Offsets.

Nun der praktische Teil, denn da haben wir keine Orakel-TMs und sonstige Thi-Späße:

Eine Ganzzahldivision einer ALU liefert immer auch den Divisionsrest. Das ist also eine OP. Und im Restklassenring rechnet es sich eben angenehm.

Spielt heute natürlich keine Rolle mehr, historisch betrachtet, als die APIs entstanden, war das definitiv noch anders.

0
MagisterSamael  28.08.2021, 06:13
@KarlRanseierIII
12%12 ist 0 ;-).

Korrekt.

(157%12+12)%12 ginge, allerdings nicht mehr,

Klammern falsch gesetzt. Ich ginge davon aus, dass wir hier Punkt vor Strich Rechnung anwenden.

Meine Formel würde so aussehen:

(157%12)+(11%12)

Das wäre vollkommen korrekt.

Des weiteren muss man im ersteren Falle mit der Überschreitung des Jahresendes auch auf die Jahreszahl addieren, was bei deiner Methode unnötige Unterschritte benötigt.

Meine Methode könnte man tatsächlich abermals besser umformen und den doppelten Modulo-Mist auslassen:

let y=2021,m=157,cM=11;
y+=Math.floor(157/12);
let mN=m%12+cM;
if(mN>12){mN-=12;y++};
console.log(`${mN}.${y}`);

So haben wir auch die korrekte Jahresberechnung, für die du zwei extra Schritte bräuchtest.

0
KarlRanseierIII  28.08.2021, 13:39
@MagisterSamael

Was immernoch eine Sonderbehandlung benötigt.

Aber machen wir es doch anders, bei Zeiten nutzen wir Z60 und Z24, in der Dezimaldarstellung Z10. Rechner rechnen immer in Z2^n (Ganzzahlarithmetik) und deswegen werden letztlich auch Arrays der Größe n mit den Elementen aus Zn indiziert. (Auch hier wird die Arithmetik deutlich vereinfacht)

Ein Jahr ist ein Zyklus von 12 Monaten, Z12 ist da extrem praktisch. Und die Elemente sind halt leider 0..11.

0
Von Experte medmonk bestätigt

Ave!

Indizierungen starten immer bei 0.

Jeder, der anderes kennt und behauptet kann nur Schmutz-Sprachen.

Wieso haben wir diesen Fall dann nur bei .getMonth() | .getDay() | .etc, aber nicht bei .getDate()?

Simple Antwort, die dir wohl die wenigsten geben können:

Arrays starten beim Index 0, wie bereits gesagt.

Bis auf der Tageszahl haben alle Werte einen differenzierten Namen (Monat -> bspw. Januar | Wochentag -> bspw. Mittwoch).

Diese Namen werden in Arrays gespeichert und beim Aufruf schlicht indiziert.

Der genaue Tag wie bei .getDate() hat natürlich keinen Namen, deshalb erhältst du hier keinen zero-based Index zurück.

Und nun Hausaufgabe: Theoretische Informatik lernen :)

Grüßchen.


medmonk  28.08.2021, 03:27

Schön auf den Punkt gebracht, ich hätte es selber nicht besser schreiben können.

1
RANGObro 
Beitragsersteller
 28.08.2021, 02:41

Ich bin nicht davon ausgegangen, dass Monate mit index angegeben werden, ich habe gedacht JS gibt hier direkt einen output für den Endnutzer der nicht programmiert

0