Thread Allgemeine Performance-Frage (11 answers)
Opened by bianca at 2011-10-28 20:09

rosti
 2011-10-28 22:37
#153661 #153661
User since
2011-03-19
3238 Artikel
BenutzerIn
[Homepage]
user image
Anbei die Umrechnung nach J.J. Scaliger

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
sub _julianday{
        my ($day, $month, $year) = @_;
        my ($jd, $a, $y, $m) = ();
        
        if($year < 0){ $year++; }
        $a = (14 - $month)/12;
        $y = $year + 4800 - $a;
        $m = $month + 12 * $a - 3;

        # zunaechst gregorianisch rechnen, ist jd < 2299160 (4.10.1582), wird julianisch gerechnet 
        $jd = $day + ((153 * $m + 2)/5) + 365 * $y + ($y/4) - ($y/100) + ($y/400) - 32045;

        # hier wird julianisch gerechnet
        if( $jd < 2299160 ){
                $jd = $day + ((153 * $m +2)/5) + 365 * $y + ($y/4) - 32083;
        }

        return $jd;
}
sub _julianday_to_date{
        my $jd = shift;
        
        # Gregorian, common
        my $a = $jd + 32044;
        my $b = ( ( $a * 4 + 3)/146097);
        my $c = $a - (146097 * $b/4);
        my $gregorian = 1;

        # Pruefe auf Julian
        if($jd <= 2299160){
                $b = 0;
                $c = $jd + 32082;
                $gregorian = 0;
        }

        my $d = ((4 * $c + 3)/1461);
        my $e = $c - ((1461 * $d)/4);
        my $m = (($e * 5 + 2)/153);

        my $day = $e - ((153 * $m +2)/5) + 1;
        my $month = $m + 3 - ($m/10) * 12;
        my $year = 100 * $b + $d - 4800 + ($m/10);

        if($year < 0){ $year--; }
        if($year == 0){ $year = -1; }

        return ($day, $month, $year, $gregorian);       
}


die Zählung ist lückenlos ab 1.1.-4713 (entspricht 1.1.4712 BC), den Wochentag erhältst Du infolge Modulo 7 und zum Testen auf ein Schaltjahr vergleiche die JD vom 29.2. und 1.3.

So einfach kann Kalenderrechnung sein ;)

PS: Die Gregorianische Reform habe ich eingebaut, d.h. die Tage sind auch lückenlos über den 4.10.1582 zum 15.10.1582, das sind die Folgetage.
Last edited: 2011-10-28 22:39:24 +0200 (CEST)

View full thread Allgemeine Performance-Frage