Da ich hier nichts gefunden habe, hab ich Wikipedia bemüht und folgendes gebastelt (wenns jemand braucht) :
(defun julia->gregor (julia / GREGOR JAHR JD0 LJ LT
MK MONAT N1 N100 N4 N400 R100 R4
R400 SK TAG
)
;;;In dieser Rechnung wird der Anfang des Gregorianischen Kalenders auf den 1. Januar des Jahres 1 vorverlegt.
;;;Dadurch beginnt der Kalender am Anfang eines 400-Jahres-Zyklus und die Rechnung vereinfacht sich.
;;;Als laufendes Jahr (LJ) wird die Anzahl Jahre ab diesem Startjahr bezeichnet.
;;;Für das Jahr 1 ist LJ=0, für das Jahr 2 ist LJ=1 usw. Das Julianische Datum dieses Tages ist JD0 = 1721426.
(setq JD0 1721426)
;;;Um ein Datum des Gregorianischen Kalenders bei gegebenem Julianischen Datum zu berechnen,
;;;werden zunächst die Anzahl der vollen 4-Jahres-Zyklen (N400) seit dem Startjahr und die Anzahl Tage (R400) des letzten, unvollständigen 400-Jahres-Zyklus berechnet:
;;;N400 = (JD - JD0)/146097 (ganzzahlig)
;;;R400 = Rest dieser Division
(setq N400 (/ (- (fix julia) JD0) 146097)
R400 (rem (- (fix julia) JD0) 146097)
)
;;;Als nächstes wird die Anzahl der vollen 100-Jahres-Zyklen (N100) des unvollständigen 400-Jahres-Zyklus berechnet, sowie die Anzahl Tage (R100) des letzten, unvollständigen 100-Jahres-Zyklus:
;;;
;;;N100 = R400/36524 (ganzzahlig)
;;;R100 = Rest dieser Division
(setq N100 (/ R400 36524)
R100 (rem R400 36524)
)
;;;Am letzten Tag des Zyklus ergibt die Rechnung N100=4 und R100=0. In diesem Fall müssen die Werte korrigiert werden:
;;;
;;;falls (N100=4) setze N100=3 und R100=36524
(if (= N100 4)
(setq N100 3
R100 36524
)
)
;;;Dann wird die Anzahl der vollen 4-Jahres-Zyklen (N4) des unvollständigen 100-Jahres-Zyklus berechnet, sowie die Anzahl Tage (R4) des letzten, unvollständigen 4-Jahres-Zyklus:
;;;
;;;N4 = R100/1461 (ganzzahlig)
;;;R4 = Rest dieser Division
(setq N4 (/ R100 1461)
R4 (rem R100 1461)
)
;;;Schließlich wird die Anzahl der vollen Jahre (N1) des unvollständigen 4-Jahres-Zyklus berechnet, sowie der laufende Tag (LT) im letzten Jahr:
;;;
;;;N1 = R4/365 (ganzzahlig)
;;;LT = Rest dieser Division
(setq N1 (/ R4 365)
LT (rem R4 365)
)
;;;Am letzten Tag des Zyklus ergibt die Rechnung N1=4 und LT=0. In diesem Fall müssen die Werte korrigiert werden:
;;;
;;;falls (N1=4) setze N1=3 und LT=365
(if (= N1 4)
(setq N1 3
LT 365
)
)
;;;Das laufende Jahr LJ ergibt sich zu:
;;;
;;;LJ = 400*N400 + 100*N100 + 4*N4 + N1
(setq LJ (+ (* 400 N400) (* 100 N100) (* 4 N4) N1))
;;;Die Berechnung der Jahreszahl (J) aus LJ ergibt sich durch:
;;;
;;;J = LJ + 1
(setq Jahr (+ LJ 1))
;;;Zur Berechnung des laufenden Tages (LT) bei gegebenem Monat (M) und Tag (T) ist eine vom Monat abhängige Korrektur (MK) und eine Schaltjahreskorrektur (SK) erforderlich.
;;;Die Schaltjahreskorrektur ist:
;;;
;;; SK = 1 (für Schaltjahre, wenn der Monat später als März liegt (M>2))
;;; SK = 0 (sonst)
;;;Das dabei anzuwendende Schaltjahreskriterium lautet:
;;;
;;;Schaltjahre sind die durch 4 teilbaren Jahre.
;;;Die durch 100 teilbaren Jahre sind keine Schaltjahre, wenn sie nicht auch durch 400 teilbar sind.
;;;Die Monatskorrektur (MK) ergibt sich aus der Tabelle:
;;;
;;; M MK Monatsname M MK Monatsname M MK Monatsname
;;; ---------------------- ---------------------- ----------------------
;;; 1 -1 Januar 5 -1 Mai 9 +2 September
;;; 2 0 Februar 6 0 Juni 10 +2 Oktober
;;; 3 -2 März 7 0 Juli 11 +3 November
;;; 4 -1 April 8 +1 August 12 +3 Dezember
;;;M = (LT+1)/30 + 1 (ganzzahlig)
;;; T = LT - 30*(M-1) - (SK + MK)
(setq Monat (+ (/ (+ LT 1) 30) 1))
(if (and (= (rem Jahr 4) 0)
(not (and (= (rem Jahr 100) 0) (not (= (rem Jahr 400) 0))))
(> Monat 2)
)
(setq SK 1)
(setq SK 0)
)
(setq MK (nth (1- Monat) '(-1 0 -2 -1 -1 0 0 1 2 2 3 3)))
(setq Tag (- LT (* 30 (- Monat 1)) (+ SK MK)))
(if (= (strlen (itoa Monat)) 1)
(setq Monat (strcat "0" (itoa Monat)))
(setq Monat (itoa Monat))
)
(if (= (strlen (itoa Tag)) 1)
(setq Tag (strcat "0" (itoa Tag)))
(setq Tag (itoa Tag))
)
(setq gregor (strcat (itoa Jahr) "-" Monat "-" Tag))
)
------------------
Gruß
Andreas
http://kraus-cad.de
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP