Includes | | | | - 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 |
| | | | |
| | | | | - 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 |
| | | | |
| | 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. |
| | | | |
| | 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
|
| | | | |
| | GDL | Gültigkeitsbereich: 1970 bis 2099
Sniff, bin aba 61 geboren.
Servus Georg |
| | | | |
| | 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 |
| | | 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) |
| | | | |
| | 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] |
| | | | |
| | | Frank Abbing
Frank AbbingP.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? |
| | | | |
| | 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 ▲ |
| |
|
AntwortenThemenoptionen | 19.196 Betrachtungen |
ThemeninformationenDieses Thema hat 10 Teilnehmer: |