hotti: Datum berechnen

Beitrag lesen

Hallo,

Btw., 4713 BC ist ein Schaltjahr, wenn wir den Julianischen Kalender annehmen…

mit Sicherheit nicht. Damals gabs den noch nicht.

Die Berechnung des Astronomischen Datums (Fortlaufende Tage) basiert auf der Annahme s.o. So ergibt sich vom Tag = 0 (1.1.4713BC) bis heute der fortlaufende Tag zu 2456913

Erster Entwurf für Datei ScaligerClass.js:

  
    function ScaligerJuli() {} /* coming soon */  
    function ScaligerGreg(day, month, year){  
        if(!day || !month || !year){  
            var d = new Date();  
            day   = d.getDate();  
            month = d.getMonth() + 1;  
            year  = d.getFullYear();  
        }  
  
        /* Scaliger-Tag gregorianisch */  
        this.dmy2jd = function(day, month, year){  
            if(year < 0){ year++; }  
            var a = Math.floor((14 - month)/12);  
            var y = Math.floor(year + 4800 - a);  
            var m = (month + 12 * a - 3);  
            var jd = Math.floor(day + (Math.floor(153 * m + 2)/5) + Math.floor(365 * y) + Math.floor(y/4) - Math.floor(y/100) + Math.floor(y/400) - 32045);  
            return jd;  
        };  
  
        /* Setter: Die Instanz wird neu berechnet */  
        this.jd2dmy = function(jd){  
            // Gregorian  
            var a = jd + 32044;  
            var b = Math.floor( ( a * 4 + 3)/146097);  
            var c = a - Math.floor((146097 * b/4));  
  
  
            var d = Math.floor((4 * c + 3)/1461);  
            var e = c - Math.floor(1461 * d/4);  
            var m = Math.floor(((e * 5) + 2)/153);  
  
            var day = e - Math.floor((153 * m +2)/5) + 1;  
            var month = m + 3 - Math.floor(m/10) * 12;  
            var year = 100 * b + d - 4800 + Math.floor(m/10);  
  
            if(year < 0){ year--; }  
            if(year == 0){ year = -1; }  
  
            this.hash.day   = day;  
            this.hash.month = month;  
            this.hash.year  = year;  
            this.hash.jd = jd;  
        };  
  
        /* Setter, die Instanz wird neu berechnet */  
        this.add = function(days){  
            days = new Number(days);  
            if(isNaN(days)){  
                alert("To add days must be numeric");  
                return;  
            }  
            this.jd2dmy(this.hash.jd + days);  
        };  
  
        /* Liegt ein Schaltjahr vor? */  
        this.isleap = function(){  
            return this.dmy2jd(1, 3, this.hash.year) == this.dmy2jd(29, 2, this.hash.year) ? false : true;  
        };  
  
        /* Validate Date */  
        this.isvalid = function(){  
            var jd_in = new Number(this.hash.jd);  
            if( isNaN(jd_in) ) return false;  
            var clone = new ScaligerGreg();  
            clone.jd2dmy(jd_in);  
            return clone.hash.day == this.hash.day && clone.hash.month == this.hash.month && clone.hash.year == this.hash.year ? true : false;  
        };  
  
        /* Anzahl der Tag in einem Monat */  
        this.ultimo = function(){  
            var month = this.hash.month;  
            var year = this.hash.year;  
            var hunt = {  
                1: 31,  
                2: this.isleap(year) ? 29 : 28,  
                3: 31,  
                4: 30,  
                5: 31,  
                6: 30,  
                7: 31,  
                8: 31,  
                9: 30,  
                10: 31,  
                11: 30,  
                12: 31  
            };  
            return hunt[month];  
        };  
  
        /* Constructor */  
        this.hash = {  
            jd: this.dmy2jd(day, month, year),  
            day: day,  
            month: month,  
            year: year,  
        };  
  
        return this;  
    }  
  
    var greg = new ScaligerGreg(1,2,1904);  
    console.log(greg.hash.jd, greg.hash.day, greg.hash.month, greg.hash.year, greg.ultimo());  
    //greg.add(13);  
    //console.log(greg.hash.jd, greg.hash.day, greg.hash.month, greg.hash.year);