Español
Fuente/ Codesnippets

Berechnungen Kalender

 

Michael
Wodrich
Leider es en el beiden folgenden Características todavía el Wurm drin...
KompilierenMarcaSeparación
Proc Date2Days

    Wandelt das Datum eine eine Anzahl von Tagen.
    Hiermit können Berechnungen leichter durchgeführt werden.
    Die Umkehrfunktion Days2Date() erstellt daraus wieder ein gültiges Datum.
    Parameters Date&
    Declare Century&,Year&,Month&,Day&
    Century& = @GetCentury(Date&)
    Year& = @GetYear(Date&)
    Month& = @GetMonth(Date&)
    Day& = @GetDay(Date&)

    If Month& > 2

        Sub Month&,3

    Else

        Add Month&,9

        If (Year&)

            Dec Year&

        Else

            Year& = 99
            Dec Century&

        EndIf

    EndIf

    Return @Int((146097 * Century&) / 4 + (1461 * Year&) / 4 + (153 * Month& + 2) / 5 + Day& + 1721119)

ENDPROC


KompilierenMarcaSeparación
Proc Days2Date

    Wandelt una Anzahl de Tagen en una gültiges Datum en.
    Zusammen con Date2Days() puede así leichter Datumsberechnungen durchgeführt se.
    Parámetros Days&
    Declarar Century&,Year&,Month&,Day&
    Days& = Days& - 1721119
    Century& = (4 * Days& - 1) / 146097
    Days& = 4 * Days& - 1 - 146097 * Century&
    Day& = Days& / 4
    Year& = (4 * Day& + 3) / 1461
    Day& = 4 * Day& + 3 - 1461 * Year&
    Day& = (Day& + 4) / 4
    Month& = (5 * Day& - 3) / 153
    Day& = 5 * Day& - 3 - 153 * Month&
    Day& = (Day& + 5) / 5

    If Month& < 10

        Add Month&,3

    Más

        Sub Month&,9
        Inc Year&

        If Year& > 99

            Year& = 0
            Inc Century&

        EndIf

    EndIf

    Volver @MakeDate(Century&,Year&,Month&,Day&)

ENDPROC


El Características debería auch Daten antes 1583 korrekt berechnen.

Auf el 4.10.1582 folgte por el Kalenderreform el 15.10.1582, lo fueron also 10 Tage gestrichen, en el Schaltjahr-Fehler otra vez auszugleichen.

Aber genau hier se ejecuta el Hin- y zurückrechnen de el Ruder.

Denksportaufgabe?

MfG
Michael Wodrich
 
Programmieren, das spannendste Detektivspiel der Welt.
07.06.2004  
 




Michael
Wodrich
Hier el Original-Auszug.

Yo weiß el Quelle por desgracia, no mehr. Hatte Yo veces de el Internet simplemente en un Textdatei gegrabbt (desafortunadamente sólo esta Teil):



Julianischer Tag
Lo gäbe kein Jahr-2000-Problema, si todos Programmierer y Computerhersteller el Julianische Tageszahl
para el Datum verwendet hätten. Stattdessen wurde el Jahr como Zeichenkette (TTMMJJ) gespeichert y el
führte dazu, daß después de 99 el Jahr 00 kommt. Grund para el zweistellige Speicherung el Jahreszahl war el
Zwang para Speichersparen. Auch hier liegt el Julianische Tageszahl vorne, ellos hätte todavía weniger Speicher
gebraucht.

El Julianische Tageszahl - oder einfacher el Julianische Tag - es una fortlaufende Zählung el Tage,
beginnend con el Tag 0, el al 1. Januar 4713 v. Chr. (en el proleptischen Julianischen Kalender) en 12 Uhr
Mittags begann. Dementsprechend beginnt una neuer Julianischer Tag De todos modos en 12 Uhr Mittags,
qué ursprünglich para el europäische Astronomie el Vorteil besaß, daß todos Beobachtungen uno Nacht a una
einzigen Julianischen Tag stattfanden.
El Julianische Tageszählung läßt se por Anhängen des seit 12 Uhr Mittags verflossenen Tagesbruchteils ligeramente
a uno genauen Zeitangabe erweitern. So bezeichnet JD 2451605 el Tag, el al 1. März 2000 en 12 Uhr beginnt,
während JD 2451605.25 el Zeitpunkt en 18 Uhr desselben Tages determinado.

Diese Erweiterung se en vielen Quellen como Julianisches Datum bezeichnet.

Julianische Tage fueron früher en el Regel (sofern nichts más spezifiziert wurde) después de mittlerer Sonnenzeit
gezählt, heute después de UT.
El Weltzeit oder Universal Time (UT) wurde 1926 como Ersatz para el Greenwich Mean Time (GMT) eingeführt.
A dieser Tiempo waren mehrere, para Teil deutlich diferente Bedeutungen de GMT en el Gebrauch.

UT es para meisten praktische Belange gleichzusetzen con el mittleren Sonnenzeit bezogen en el Nullmeridian
de Greenwich.
Alternativ fueron Angaben auch en Ephemeridenzeit gemacht, qué por el Bezeichnung JED oder JDE
gekennzeichnet wurde. Auch Hoy es gelegentlich sinnvoll, Julianische Tage en uno otro como el UT-Skala
anzugeben. El verwendete Zeitskala es entonces a el Zeitangabe anzuhängen, z.B. como JD 2 451 545.0 TDT para
el 1.Januar 2000, 12 Uhr Mittags después de TDT-Tiempo.

Häufig encontrar se auch Zeitangaben en un Modifizierten Julianischen Datumsformat (MJD).
El gebräuchlichste Definition uno MJD folgt de MJD = JD - 2400000.5 el Nullpunkt liegt por lo tanto
beim 17. November 1858 en 0 Uhr (!) Weltzeit.

Andere Definitionen existieren allerdings auch, así daß en Verwendung de Daten en MJD Vorsicht geboten es.
Aus diesem Grunde se MJD auch de el Internationalen Astronomischen Union no anerkannt.

El Bedeutung el Julianischen Tagesangabe en el heutigen Astronomie liegt para una en el Möglichkeit uno
kompakten, eindeutigen Zeitangabe, para otro en el einfachen Angabe y Berechnung de Zeitdifferenzen,
Perioden usw.

El Julianische Tageszählung wurde 1581 de el französischen Gelehrten Joseph Justus Scaliger
(en seinem Werk Opus novum de emendatione temporum) eingeführt, una eindeutige Zeitzählung sin negative
Jahreszahlen a obtener. Dazu mußte el Anfang el Zeitzählung genügend weit en el Vergangenheit en
vorhistorischen Veces mentira. Scaliger konstruierte primero una 7980 Jahre währende Julianische Período,
indem él folgende Zyklen kombinierte:

el 28jährigen Sonnenzyklus, en el se (en el Julianischen Kalender) el Kalenderdaten en denselben
Wochentagen wiederholen (en el Gregorianischen Kalender wäre dieser Zyklus 400 Jahre lang);

el 19jährigen Metonischen Zyklus, en el el Mondphasen y Finsternisse a nahezu denselben
Kalenderdaten wiederholen; y

el 15jährigen Indiktionszyklus, el en el Römischen Reich a Steuererhebung y Volkszählung verwendet wurde
y, beginnend con el 25.Dezember 312 n.Chr, a fortlaufenden Datierung a en el heutige Tiempo diente.

Das letzte Jahr, en el todos drei Zyklen gemeinsam una neuen Durchlauf begannen, war 4713 v. Chr.
Den 1. Januar dieses Jahres legte Scaliger como Beginn su Zeitrechnung fest. Für el meisten Menschen
el damaligen Epoche war dieses Datum allerdings fiktiv, como después de ihrem Glauben el Welt sólo wesentlich später
erschaffen wurde. Scaliger incluso datierte el Erschaffung el Erde el Jahr 3267 v.Chr.

Der Algorithmus stellt se entonces folgendermaßen dar:
Y = Jahr, M = Monat (Januar = 1, Februar = 2, etc.),
D = Tag (eventuell con Tagesbruchteilen)

Ist M > 2 lasse Y y M unverändert.
Ist M = 1 oder M = 2 entonces
Y = Y - 1
M = M + 13

Im Gregorianischen Kalender rechnet uno más:
A = INT (Y/100)
B = 2 - A + INT (A/4)
Im Julianischen Kalender es B = 0!

Das gesuchte JD es entonces:
JD = INT (365.25 * (Y + 4716))
+ INT (30.6001 * (M + 1)) + D
+ B - 1524.5

Das Programa para Berechnen des Julianischen Datums stellt se entonces folgendermaßen dar.
Beachten Sie, daß wegen el Besonderheit des Julianischen Datums el Tag no como Integer,
pero como Gleitpunktzahl dargestellt se.
Im Programa es todavía una zweites Unterprogramm enthalten, el el JD otra vez en unser gewohntes Datumsformat,
el Gregorianische Datum, umrechnet:
KompilierenMarcaSeparación
#include <stdio.h>
#include <stdlib.h>
struct datum

{

    double tag;
    int monat;
    int jahr;

};

double julian_day(double day, int month, int year);
struct datum gregorian_date(double jday);
int main(void)

{

    int tag, monat, jahr;
    double jd;
    struct datum dat;
    printf(Tag, Monat und Jahr eingeben: );
    scanf(%d %d %d,&tag, &monat, &jahr);
    jd = julian_day(1.0*tag, monat, jahr);
    printf(
    Julianischer Tag fuer den %d.%d.%d = %1.2f
    ,
    tag, monat, jahr, jd);
    dat = gregorian_date(jd);
    printf(
    Zurueckgerechnet: %1.0f.%d.%d
    , dat.tag, dat.monat, dat.jahr);
    return 0;

}

/* Julianischer Tag (>=1):
* Gegeben: tag, monat, jahr
*
* Die gregorianische Kalenderreform wird beruecksichtigt (der Tag, der
* auf den 4. Oktober 1582 folgt ist der 15. October 1582
* Tage nach dem 15. Oktober 1582 werden als Gregorianischer Kalender
* bezeichnet. Der Julianische Tag beginnt um 12 Uhr GMT (Mittag).
* Um beliebige Uhrzeiten beruecksichtigen zu koennen, werden die Tage
* nicht als Integer- sondern als Gleitpunktzahlen angegeben.
*/
double julian_day(double day, int month, int year)

{

    int atmp, btmp, monthp, yearp;
    double ctmp;

    if (month > 2)

        {

            monthp = month + 1;
            yearp = year;

        }

    else

        {

            monthp = month + 13;
            yearp = year - 1;

        }

        if ((year > 1582) || (year == 1582 && month >= 10)

            || (year == 1582 && month ==10 && day >= 15))

            {

                atmp = year / 100;
                btmp = 2 - atmp + (atmp / 4);

            }

        else

            btmp = 0;
            atmp = 365.25 * yearp;
            ctmp = atmp;
            atmp = 30.6001 * monthp;
            ctmp =  ctmp + atmp;
            return (ctmp + day + 1720994.5 + btmp);

        }

        /* gregorian_date: Umrechnung Julianischer Tag
        in (Tag, Monat, Jahr) */
        struct datum gregorian_date(double jday)

        {

            int atmp, btmp, ctmp, dtmp, etmp, gtmp, ztmp;
            double ftmp;
            struct datum dd;
            ztmp = jday + 0.5;
            ftmp = (jday + 0.5) - ztmp;

            if (ztmp >= 2299161)

                {

                    gtmp = (ztmp - 1867216.25) / 36524.25;
                    ctmp = gtmp / 4;
                    atmp = ztmp + 1 + gtmp - ctmp;

                }

            else

                atmp = ztmp;
                btmp = atmp + 1524;
                ctmp = (btmp - 122.1) / 365.25;
                dtmp = 365.25 * ctmp;
                etmp = ((btmp - dtmp) / 30.6001);
                ztmp = 30.6001 * etmp;
                dd.tag = btmp - dtmp - ztmp + ftmp;

                if (etmp > 13.5)

                    dd.monat = etmp - 13;

                else

                    dd.monat = etmp - 1;

                    if (dd.monat > 2.5)

                        dd.jahr = ctmp - 4716;

                    else

                        dd.jahr = ctmp - 4715;
                        return(class=s4 href='./../../funktionsreferenzen/XProfan/dd/'>dd);

                    }




Yo hoffe, el hilft en Interruptor. Alternativ könnten wir lo en efecto en Fließkommazahl belassen.

MfG
Michael Wodrich
 
Programmieren, das spannendste Detektivspiel der Welt.
07.06.2004  
 



Zum Quelltext


Título del Tema, max. 100 Signo.
 

Systemprofile:

Kein Systemprofil creado. [anlegen]

XProfan:

 Contribución  Font  Smilies  ▼ 

Bitte registro en una Contribución a verfassen.
 

Tema opciones

2.741 Views

Untitledvor 0 min.
Tango21.07.2017
Uwe Lang06.02.2015
Michael Wodrich21.02.2014
Thomas Freier30.08.2013
Más...

Themeninformationen

Dieses Thema ha 1 subscriber:

Michael Wodrich (2x)


Admins  |  AGB  |  Applications  |  Autores  |  Chat  |  Política de Privacidad  |  Descargar  |  Entrance  |  Ayuda  |  Merchantportal  |  Pie de imprenta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Juegos  |  Búsqueda  |  Support

Ein Projekt aller XProfan, el lo son!


Mi XProfan
Privado Noticias
Eigenes Ablageforum
Temas-Merkliste
Eigene Beiträge
Eigene Temas
Zwischenablage
Cancelar
 Deutsch English Français Español Italia
Traducciones

Política de Privacidad


Wir uso Cookies sólo como Session-Cookies wegen el technischen Notwendigkeit y en uns hay no Cookies de Drittanbietern.

Wenn du hier en unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung de Informationen en unseren Cookies en XProfan.Net a.

Weitere Informationen a unseren Cookies y dazu, como du el Kontrolle darüber behältst, findest du en unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Yo möchte no Cookie