Deutsch
Includes

Datum und Uhrzeit berechnen 2

 
- Seite 1 -



Clemens
Meier
Hallo zusammen,

ich benutze XProfan erst wieder seit ein paar Tagen, um für einen Freund ein Geburtstagsgeschenk zu basteln. Dabei fiel mir auf, dass in XProfan so gut wie keine Datum- und Uhrzeitfunktionen zu finden sind. Man bekommt zwar das aktuelle Datum und die aktuelle Uhrzeit, doch das war es schon. Nichts mit berechnen, vergleichen oder ähnliches. Und da ich auch noch ein begeisterter PHPler bin, der Dinge wie date und mktime kennt, habe ich mal dran gesetzt und beides für XProfan als include-Datei realisiert.

Ich habe allerdings ein paar Stunden gebraucht, weil beim Testen spezieller Sonderfälle immer wieder kleinere Probleme auftauchten, die hoffentlich nun alle beseitigt sind.

Gültigkeitsbereich: 1970 bis 2099
Sommerzeit und GMT wird nicht berücksichtigt (wäre nur wichtig, wenn man über den Rechner hinaus Zeiten vergleichen muss)

Angaben von Monats- und Wochentagsnamen sind in Deutsch. Wochennummern nach ISO (ächz, war nicht leicht). Und natürlich kann man innerhalb der mktime - Funktion auch rechnen und die Funktion übernimmt die Korrektur der Daten (Beispiel siehe beiliegender datumuhrzeit.prf). Weiteres siehe hinweis.txt in der Zip-Datei.

Ich hoffe, es kann gebraucht werden und ich freue mich auf ein Feedback

Gruß

Clemens

4 kB
Hochgeladen:16.03.2006
Ladeanzahl466
Herunterladen
 
XProfan 9.1; XP SP2; FF; Editpad
16.03.2006  
 



 
- Seite 1 -


Ja, im deutschen Kalender beginnt die erste Woche mit der Woche zu zählen, die mindestens 4 Tage hat. Durch diese Verschieberei kann es in einem Jahr sogar 53 Wochen geben - es muß also auch das Vorjahr mit beachtet werden, wenn die erste Woche nicht bei 1 beginnt (Entscheidung: 52. od. 53. Woche des Vorjahres).

[quote:0bf01e8fa7=Clemens Meier]Und da ich auch noch ein begeisterter PHPler bin[/quote:0bf01e8fa7]
Dann schau Dir auch mal das Codesnippet unix time PHP an.

Ansätze für Datum und Zeitberechnungen findest Du über die Suchfunktion, es gab da schon einige Sachen.

Vielleicht entsteht ja doch noch mal ein kompletter Satz an Datum-/Zeitroutinen.

Schöne Grüße
Michael Wodrich
 
16.03.2006  
 




Jac
de
Lad
Geht prima, hab bis jetzt keine Fehler entdecken können.

@Frank: Da hätte ich Parcival also auch im Wettbewerb posten können??? Geht das jetzt auch noch, obwohl ich schon so viel hin- und hergepostet hab???

Jac
 
Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE)
Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP
17.03.2006  
 




Frank
Abbing
Klar, Jac. Wüsste nicht, was dagegen sprechen sollte.
 
17.03.2006  
 




ByteAttack
Naja! Ich weiß jetzt echt nicht woran es liegt, aber die Include hängt sich auf, sobald der 31.12.2007 ins Spiel kommt.
Bitte mal Probieren:
 $I date.inc
Declare monat%,tag%,jahr%,temp$
WindowStyle 26
WindowTitle date.inc Test
Window 0,0-%maxX,%maxY
Erster Test
monat%=12
tag%=31
jahr%=2008
temp$=Ein Tag später als der +str$(tag%)+.+Str$(monat%)+.+Str$(jahr%)+ ist der:
print temp$+Ins$(.,Ins$(.,fdate(%d%m%Y,mktime(0,0,0,monat%,tag%+1,jahr%)),3),6) +1Tag
Zweiter Test
jahr%=2007
temp$=Ein Tag später als der +str$(tag%)+.+Str$(monat%)+.+Str$(jahr%)+ ist der:
print temp$+Ins$(.,Ins$(.,fdate(%d%m%Y,mktime(0,0,0,monat%,tag%+1,jahr%)),3),6) +1Tag
waitmouse
 
Website:  [...] 
Facebook:  [...] 
30.10.2007  
 




GDL
Gültigkeitsbereich: 1970 bis 2099

Sniff, bin aba 61 geboren.

Servus
Georg
 
Windows7 Xprofan 8,9,10 [...]  [...] 
30.10.2007  
 




Dieter
Zornow
Bei mir stimmt einiges nicht beim Test z.B. jetziges Datum und Uhrzeit vor 100 Stunden kommt bei mir
01.01.1970 00.00:00, das Beispiel von Marc ist auch daneben.

Gruß aus Bangkok

Dieter

21 kB
Hochgeladen:31.10.2007
Ladeanzahl465
Herunterladen
 
Er ist ein Mann wie ein Baum. Sie nennen ihn Bonsai., Win 7 32 bit und Win 7 64 bit, mit XProfan X2
31.10.2007  
 




ByteAttack
Naja, ich glaube mit der MWDATE.DLL ist man besser dran. (Geht bloß leider nur unter Profan ab Version 10)
 
Website:  [...] 
Facebook:  [...] 
31.10.2007  
 




Michael
Wodrich
Marc-Gordon
Naja, ich glaube mit der MWDATE.DLL ist man besser dran. (Geht bloß leider nur unter Profan ab Version 10)


Dann muß ich mich da wohl doch noch mal dransetzen?

Die Includedatei kann so angepasst werden, das auch frühere Versionen damit klar kommen (dann fallen einige in der Include programmierte Dinge weg; oder werden umgeschrieben).

Ich werds mir nochmal in die ToDo-Liste setzen...

Schöne Grüße
Michael Wodrich

P.S.: Die DLL fängt bei 1600 an (wegen Schaltjahr-Gedöns). Ich persönlich kenne keinen mehr persönlich, der vorher geboren wurde.
 
Programmieren, das spannendste Detektivspiel der Welt.
31.10.2007  
 



 
- Seite 2 -



Frank
Abbing

P.S.: Die DLL fängt bei 1600 an (wegen Schaltjahr-Gedöns). Ich persönlich kenne keinen mehr persönlich, der vorher geboren wurde.


[web]https://de.wikipedia.org/wiki/Gregorianischer_Kalender[/web]
 
31.10.2007  
 



Frank Abbing
Frank Abbing
P.S.: Die DLL fängt bei 1600 an (wegen Schaltjahr-Gedöns). Ich persönlich kenne keinen mehr persönlich, der vorher geboren wurde.


[web]https://de.wikipedia.org/wiki/Gregorianischer_Kalender[/web]


Was hat das eine mit dem Anderen zu tun?
 
31.10.2007  
 




Michael
Wodrich
Das war ein Wink mit dem Zaunpfahl.

Das Schaltjahr-Gedöns war eine richtige Kalenderreform - ein Krimi:
Papst Gregor stiehlt der ganzen Welt 10 Tage.

Den Link hatte ich übrigens noch nicht in meiner Sammlung - muß recht neu sein.
Allerdings ist bei Wikipedia ortelius.de nicht als Link aufgeführt - damit fehlt dort eindeutig etwas.

Schöne Grüße
Michael Wodrich
 
Programmieren, das spannendste Detektivspiel der Welt.
31.10.2007  
 




René
Wagner
Moin,

da ich in meinem aktuellen Projekt mit dieser INC arbeite, musste ich zwangsläufig ein paar kleinere Korrekturen vornehmen.
Bei der Monatstag-Definition waren ; am Ende, das klappt vielleicht mit PHP, aber nicht mit XProfan.

Ausserdem wurde in fdate einige Variablen doppelt deklariert. Nachfolgend der korrigierte INC-Code.
PROC isdate

    parameters monat%,tag%,jahr%
    declare string$,check$
    string$ = @str$(tag%)+.+@str$(monat%)+.+@str$(jahr%)

    if (jahr%>1000)

        check$ = %Y

    else

        check$ = %y

    endif

    if (string$ = fdate(%j.%n.+check$,mktime(0,0,0,monat%,tag%,jahr%)))

        return 1

    else

        return 0

    endif

ENDPROC

PROC now

    declare string$,help$,jahr%,monat%,tag%,stunde%,minute%,sekunde%
    string$ = @time$(0)+:+@substr$(@time$(1),1,.)
    help$ = @substr$(string$,1,:)
    stunde% = help$
    help$ = @substr$(string$,2,:)
    minute% = help$
    help$ = @substr$(string$,3,:)
    sekunde% = help$
    string$ = date$(3)
    help$ = @mid$(string$,1,4)
    jahr% = help$
    help$ = @mid$(string$,5,2)
    monat% = help$
    help$ = @mid$(string$,7,2)
    tag% = help$
    return mktime(stunde%,minute%,sekunde%,monat%,tag%,jahr%)

ENDPROC

PROC fdatelong

    parameters zahl%
    declare zahl$
    zahl$ = zahl%

    if (zahl%<10)

        zahl$ = 0+@str$(zahl%)

    endif

    return zahl$

ENDPROC

PROC mktime

    parameters stunde_mk%,minute_mk%,sekunde_mk%,monat_mk%,tag_mk%,jahr_mk%
    declare sekunden&,anzahltage&,monatstage$,monatstageS$,hilfe_mk%,hilfe$,ende_mk%,okay_mk%,schaltjahr$,monatb_mk%
    ; am Zeilenende entfernt
    monatstage$ = 31,28,31,30,31,30,31,31,30,31,30,31
    monatstageS$ = 31,29,31,30,31,30,31,31,30,31,30,31
    Korrigiere hier ggf. das Datum
    ende_mk% = 2

    while ende_mk%

        okay_mk% = 1
        Prüfe die Sekunden

        if (okay_mk% = 1)

            if (sekunde_mk%>59)

                sekunde_mk% = sekunde_mk%-60
                minute_mk% = minute_mk% + 1
                okay_mk% = 0

            elseif (sekunde_mk%<0)

                sekunde_mk% = sekunde_mk%+60
                minute_mk% = minute_mk% - 1
                okay_mk% = 0

            endif

        endif

        Prüfe die Minuten

        if (okay_mk% = 1)

            if (minute_mk%>59)

                minute_mk% = minute_mk%-60
                stunde_mk% = stunde_mk% + 1
                okay_mk% = 0

            elseif (minute_mk%<0)

                minute_mk% = minute_mk%+60
                stunde_mk% = stunde_mk% - 1
                okay_mk% = 0

            endif

        endif

        Prüfe die Stunden

        if (okay_mk% = 1)

            if (stunde_mk%>23)

                stunde_mk% = stunde_mk%-24
                tag_mk% = tag_mk% + 1
                okay_mk% = 0

            elseif (stunde_mk%<0)

                stunde_mk% = stunde_mk%+24
                tag_mk% = tag_mk% - 1
                okay_mk% = 0

            endif

        endif

        Prüfe den Tag

        if (okay_mk% = 1)

            schaltjahr$ = monatstage$

            if ((jahr_mk% MOD 4) = 0)

                schaltjahr$ = monatstageS$

            endif

            if (monat_mk%<1)

                monatb_mk% = ((monat_mk% - 1) MOD 12) + 13

            else

                monatb_mk% = ((monat_mk% - 1) MOD 12) + 1

            endif

            if (tag_mk%>@val(@substr$(schaltjahr$,monatb_mk%,,)))

                tag_mk% = tag_mk% - @val(@substr$(schaltjahr$,monatb_mk%,,))
                monat_mk% = monat_mk% + 1
                okay_mk% = 0

            elseif (tag_mk%<1)

                monat_mk% = monat_mk% - 1

                if (monat_mk%<1)

                    monatb_mk% = ((monat_mk% - 1) MOD 12) + 13

                else

                    monatb_mk% = ((monat_mk% - 1) MOD 12) + 1

                endif

                tag_mk% = tag_mk% + @val(@substr$(schaltjahr$,monatb_mk%,,))
                okay_mk% = 0

            endif

        endif

        Prüfe den Monat

        if (okay_mk% = 1)

            if (monat_mk%>12)

                monat_mk% = monat_mk%-12
                jahr_mk% = jahr_mk% + 1
                okay_mk% = 0

            elseif (monat_mk%<1)

                monat_mk% = monat_mk%+12
                jahr_mk% = jahr_mk% - 1
                okay_mk% = 0

            endif

        endif

        Prüfe das Jahr

        if (okay_mk% = 1)

            if (jahr_mk%<1970)

                return #OUT OF RANGE#

            elseif (jahr_mk%>2099)

                return #OUT OF RANGE#

            else

                ende_mk% = 0

            endif

        endif

    wend

    Berechne ab 1970
    jahr_mk% = @int(jahr_mk% - 1970)
    anzahltage& = jahr_mk% * 365
    Die Schaltjahre dazu

    if (monat_mk%>2)

        anzahltage& = anzahltage& + @int((jahr_mk%+2)/4)

    else

        anzahltage& = anzahltage& + @int(((jahr_mk%-1)+2)/4)

    endif

    Der Monat dazu

    if (monat_mk%>1)

        whileloop 1,(monat_mk%-1)

            hilfe$ = @substr$(monatstage$,&loop,,)
            hilfe_mk% = hilfe$
            anzahltage& = anzahltage& +  hilfe_mk%

        endwhile

    endif

    anzahltage& = anzahltage& + tag_mk% - 1  Der 1. Tag beginnt ja mit 0 Sekunden
    sekunden& = anzahltage& * 24 * 60 * 60
    sekunden& = sekunden& + (stunde_mk% * 60 * 60)
    sekunden& = sekunden& + (minute_mk% * 60)
    sekunden& = sekunden& + sekunde_mk%
    return sekunden&

ENDPROC

PROC fdate

    ende% nur noch einmal deklarieren
    declare gesamttage&,wochentag%,ende%,restsekunden&,resttage%,tagimjahr%,woche%,hilfe%,hilfe2%
    declare jahr%,monat%,tag%,stunde%,minute%,sekunde%,jahr_test%,anzahltage_test&,sekunden_test&
    declare wochentaglistekurz$,wochentaglistelang$
    declare monatekurz$,monatelang$,monatstage$,monatstageS$,schaltjahr$,testsekunden&

    if (%PCount = 1)

        Parameters datestring$
        Sekunden erst hier deklarieren, damit doppelte Deklaration unterbinden
        declare sekunden&
        sekunden& = now()

    elseif (%PCount = 2)

        Parameters datestring$,sekunden&

    else

        return

    endif

    Benötige eine Liste von Daten
    wochentaglistekurz$ = So,Mo,Di,Mi,Do,Fr,Sa
    wochentaglistelang$ = Sonntag,Montag,Dienstag,Mittwoch,Donnerstag,Freitag,Samstag
    monatekurz$ = Jan,Feb,Mär,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Dez
    monatelang$ = Januar,Februar,März,April,Mai,Juni,Juli,August,September,Oktober,November,Dezember
    ; am Zeilenende entfernt
    monatstage$ = 31,28,31,30,31,30,31,31,30,31,30,31
    monatstageS$ = 31,29,31,30,31,30,31,31,30,31,30,31
    Als erstes einmal brauche ich die Anzahl der Tage, für den Wochentag
    Der 1.1.1970 war Wochentag 4 = Donnerstag
    gesamttage& = @int(sekunden& / 86400)
    wochentag% = @int(gesamttage& MOD 7)
    Wochentag um 4 korrigieren, denn wenn wochentag% = 0 = Sonntag ist , ist es eigentlich Donnerstag
    wochentag% = wochentag% + 4

    if (wochentag%>6)

        wochentag% = wochentag% - 7

    endif

    Wenn man die Tage hat, kann man leicht an das Jahr kommen
    resttage% = gesamttage&
    jahr% = @int(((4*resttage%)/1461) + 1970)
    Vorsicht, das Jahr könnte falsch sein
    Prüfe das, indem du einen Tag vorher die mktime anfragst
    jahr_test% = jahr%
    jahr_test% = @int(jahr_test% - 1970)
    anzahltage_test& = jahr_test% * 365
    Die Schaltjahre dazu
    anzahltage_test& = anzahltage_test& + @int(((jahr_test%-1)+2)/4)
    sekunden_test& = anzahltage_test& * 24 * 60 * 60

    if (sekunden_test&>sekunden&)

        Ups, das Jahr ist falsch
        jahr% = jahr% - 1

    endif

    jahr_test% = jahr%
    jahr_test% = @int(jahr_test% - 1970)
    anzahltage_test& = jahr_test% * 365
    Die Schaltjahre dazu
    anzahltage_test& = anzahltage_test& + @int(((jahr_test%-1)+2)/4)
    sekunden_test& = anzahltage_test& * 24 * 60 * 60
     $testsekunden& muss kleiner sein, als sekunden&
    Ich brauche nun die Restsekunden für die Monate
    restsekunden& = sekunden& - sekunden_test&
    resttage% = @int(restsekunden& / (24*60*60))
    tagimjahr% = resttage%  Das Jahr beginnt ja mit dem 1. Tag, nicht mit dem 0. Tag
    In welchem Monat liegt dieser Tag
    ende% = 1
    monat% = 1
    schaltjahr$ = monatstage$

    if (jahr% MOD 4 = 0)

        schaltjahr$ = monatstageS$

    endif

    while ende%

        if ((resttage%+1)>@val(@substr$(schaltjahr$,monat%,,)))

            resttage% = resttage% - @val(@substr$(schaltjahr$,monat%,,))
            monat% = monat% + 1

        else

            ende% = 0

        endif

    wend

    tag% = resttage% + 1  Auch hier wieder, Monat beginnt mit Tag 1 und nicht Tag 0
    restsekunden& = sekunden& - mktime(0,0,0,monat%,tag%,jahr%)
    stunde% = @int(restsekunden& / (60*60))
    restsekunden& = restsekunden& MOD (60*60)
    minute% = @int(restsekunden& / 60)
    restsekunden& = restsekunden& MOD 60
    sekunde% = restsekunden&
    Berechne die Woche
    hilfe% = wochentag%

    if (hilfe%=0)

        hilfe% = 7

    endif

    woche% = @int((tagimjahr% - hilfe% + 7) / 7)
    Wenn wochentag% am 1.1.des Jahres < 5 ist, dann muss korrigiert werden
    hilfe2% = 7 - ((tagimjahr% - hilfe% + 7) MOD 7)

    if (hilfe2%=0)

        hilfe2%=7

    endif

    if (hilfe2%<5)

        woche% = woche% + 1

    elseif (woche% = 0)

        woche% = fdate(%W,mktime(0,0,0,12,24,jahr%-1)) + 1

    endif

    Und nun den String ersetzen
    datestring$ = @translate$(datestring$,%Y,@str$(jahr%))
    datestring$ = @translate$(datestring$,%y,fdatelong(@val(@Right$(@str$(jahr%),2))))
    datestring$ = @translate$(datestring$,%d,fdatelong(tag%))
    datestring$ = @translate$(datestring$,%j,@str$(tag%))
    datestring$ = @translate$(datestring$,%D,@substr$(wochentaglistekurz$,(wochentag%+1),,))
    datestring$ = @translate$(datestring$,%l,@substr$(wochentaglistelang$,(wochentag%+1),,))
    datestring$ = @translate$(datestring$,%F,@substr$(monatelang$,monat%,,))
    datestring$ = @translate$(datestring$,%G,@str$(stunde%))
    datestring$ = @translate$(datestring$,%H,fdatelong(stunde%))
    datestring$ = @translate$(datestring$,%i,fdatelong(minute%))
    datestring$ = @translate$(datestring$,%m,fdatelong(monat%))
    datestring$ = @translate$(datestring$,%n,@str$(monat%))
    datestring$ = @translate$(datestring$,%M,@substr$(monatekurz$,monat%,,))
    datestring$ = @translate$(datestring$,%s,fdatelong(sekunde%))
    datestring$ = @translate$(datestring$,%t,@substr$(schaltjahr$,monat%,,))
    datestring$ = @translate$(datestring$,%w,@str$(wochentag%))
    datestring$ = @translate$(datestring$,%W,@str$(woche%))
    datestring$ = @translate$(datestring$,%z,@str$(tagimjahr%))
    return datestring$

ENDPROC


Gruß René
 
Mit XProfan erstellte Freeware findet ihr hier:  [...] 

US World Domination Tour - bombing a country near you...
11.08.2008  
 




Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

19.212 Betrachtungen

Unbenanntvor 0 min.
Erhard Wirth14.06.2024
Sven Bader16.05.2024
H.Brill09.10.2021
Walter13.01.2016
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