Deutsch
Quelltexte/ Codesnippets

Berechnungen Erwünscht Kalender Mitwirkung

 

Michael
Wodrich
[size=18:9a05d71d8c]Kalender-Berechnungen:[/size:9a05d71d8c]
(geschrieben in XProfan; muß evtl. ein wenig angepaßt werden für frühere Versionen)

Es gibt sicherlich viele Möglichkeiten für die Verwaltung von Kalenderdaten.
Hier werden einige Routinen vorgestellt, die eine LongInt-Variable zur Speicherung benutzen.

Das dies möglich ist zeige ich hier:

2147483647 maximaler positiver LongInt-Wert
..CCYYMMDD das Datum wird so gespeichert
..hhmmsscc die Zeit wird so gespeichert

CC...... die Jahrhundert-Angabe (Century)
..YY.... das Jahr
....MM.. der Monat
......DD der Tag

hh...... die Stunde
..mm.... die Minute
....ss.. die Sekunde
......cc die Hundertstel-Sekunde (Centi)


Die Profan-internen Datum- und Zeitfunktionen können hiermit gut ergänzt werden.

Die folgenden Routinen bauen Datum und Zeit zusammen:
KompilierenMarkierenSeparieren
Def MakeFullDate(3) (@&(3)*10000)+(@&(2)*100)+@&(1)
Def MakeDate(4)     (@&(3)*1000000)+(@&(4)*10000)+(@&(2)*100)+@&(1)
Def MakeTime(4)     (@&(1)*1000000)+(@&(2)*10000)+(@&(3)*100)+@&(4)
Syntax:
KompilierenMarkierenSeparieren
Datum& = MakeFullDate(Tag&,Monat&,Jahr&) z.B.: dat& = MakeFullDate(4,6,2004)
Datum& = MakeDate(Tag&,Monat&,Jahrhundert&,Jahr&) z.B.: dat& = MakeDate(4,6,20,04)
Zeit& = MakeTime(Stunde&,Minute&,Sekunde&,Hundertstel&) z.B.: tim& = MakeTime(23,30,0,40)
Zerlegen des Datums in seine Einzelteile (Parameter ist das LongInt-Datum):
KompilierenMarkierenSeparieren
Def GetFullYear(1) @Int(@&(1) / 10000)
Def GetCentury(1)  @Int(@&(1) / 1000000)
Def GetYear(1)     @Int((@&(1) mod 1000000) / 10000)
Def GetMonth(1)    @Int((@&(1) mod 10000) / 100)
Def GetDay(1)      @Int(@&(1) mod 100)
Zerlegen der Zeit in ihre Einzelteile (Parameter ist der LongInt-Wert):
KompilierenMarkierenSeparieren
Def GetHour(1)     @Int(@&(1) / 1000000)
Def GetMinute(1)   @Int((@&(1) mod 1000000) / 10000)
Def GetSecond(1)   @Int((@&(1) mod 10000) / 100)
Def GetCenti(1)    @Int(@&(1) mod 100)
Datum- und Zeit-Vergleiche:
(d1 - Datum des 1. Wertes)
(t1 - Zeit des 1. Wertes)
(d2 - Datum des 2. Wertes)
(t2 - Zeit des 2. Wertes)
KompilierenMarkierenSeparieren
Def Time_EQ(d1,t1,d2,t2)  (@&(1) = @&(3)) and (@&(2) = @&(4))
Def Time_GE(d1,t1,d2,t2)  (@&(1) > @&(3)) or ((@&(1) = @&(3)) and (@&(2) >= @&(4)))
Def Time_GT(d1,t1,d2,t2)  (@&(1) > @&(3)) or ((@&(1) = @&(3)) and (@&(2) > @&(4)))
Def Time_LE(d1,t1,d2,t2)  (@&(1) < @&(3)) or ((@&(1) = @&(3)) and (@&(2) <= @&(4)))
Def Time_LT(d1,t1,d2,t2)  (@&(1) < @&(3)) or ((@&(1) = @&(3)) and (@&(2) < @&(4)))
Def Time_NEQ(d1,t1,d2,t2) (@&(1) <> @&(3)) or (@&(2) <> @&(4))
Das aktuelle Datum serviert Profan schon mundgerecht:
KompilierenMarkierenSeparierenBei der aktuellen Zeit muß man schon ein wenig mehr nachhelfen:
KompilierenMarkierenSeparierenIst das angegebene Jahr ein Schaltjahr?
Es werden auch Jahre vor der Kalenderreform korrekt geprüft:
KompilierenMarkierenSeparieren
Proc IsLeapYear

    Prüft, ob das angegebene Jahr ein Schaltjahr ist.
    Es muß auch das Jahrhundert angegeben werden, denn "80" meint "80 A.D."
    Parameters Year%
    Declare Erg%

    If Year% > 1582

        Erg% = (((Year% mod 4)=0) and ((Year% mod 100)<>0)) or ((Year% mod 400)=0)

    Else

        Erg% = (((Year% mod 4)=0) and ((Year% mod 100)<>0))

    EndIf

    Return Erg%

EndProc

Ermittelt den Wochentag:
KompilierenMarkierenSeparieren
Proc DayOfWeek

    Liefert den Wochentag.
    0-Sonntag, 1-Montag, ..., 6-Samstag
    Parameters Date&
    Declare Year%,Month%,Day&
    Year% = @GetFullYear(Date&)
    Month% = @GetMonth(Date&)
    Day& = @GetDay(Date&)

    If Month% > 2

        Sub Month%,2

    Else

        Add Month%,10
        Dec Year%

    EndIf

    Day& = ((13 * Month% - 1) / 5) + Day% + (Year% mod 100) + ((Year% mod 100) / 4) + ((Year% / 100) / 4) - 2 * (Year% / 100) + 77
    Return (Day& mod 7)

EndProc


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



Spitze!, wir kriege ich nach dem Prinzip eine Datums-Distance hin, welche die Anzahl der Jahre,Monate,Tage zwischen zwei Datumsangaben zurückliefert?
 
05.06.2004  
 




Michael
Wodrich
durch Umrechnung in die Julianische Tageszahl. Die ist eigentlich eine Float-Zahl. Ich wollte das Ganze in LongInt behalten, aber da ist der Wurm drin. Mal sehen, ich poste das Ding am Nachmittag mal.
Jetzt hab ich leider keine Streichhölzer mehr, um die Augen aufzuhalten...

bis dann
Michael Wodrich
 
Programmieren, das spannendste Detektivspiel der Welt.
07.06.2004  
 




Sven
Bader
Ich will eigentlich auch nur die Distanz zweiter Daten Vielleicht ist das für jemanden interessant, die Anzahl der Tage eines Monats, Schaltjahrprüfung für Februar ist auch dabei.

Def Tage(2) int(28+val(mid$(303232332323,&(1),1))+if((&(1)=2) & (&(2) MOD 4 = 0),1,0))

Aufruf: print Tage(02,2004)
Ausgabe: 29 Februar 2004 hatte 29 Tage
 
12.06.2006  
 



Zum Quelltext


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

3.832 Betrachtungen

Unbenanntvor 0 min.
Ernst07.10.2016
Georg Teles21.01.2015
Michael Wodrich21.02.2014
Pedro Miguel26.08.2013
Mehr...

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie