Woche und Tage finden

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Benutzeravatar
Muecke
1000 working lines a day
1000 working lines a day
Beiträge: 623
Registriert: Di, 24. Okt 2006 7:19
Wohnort: Samstagern CH
Hat sich bedankt: 3 Mal
Danksagung erhalten: 9 Mal
Kontaktdaten:

Woche und Tage finden

Beitrag von Muecke »

Hallo zusammen,

bin an Statistiken aufzuarbeiten und sollte folgendes haben:

zum Beispiel: Wann ist Woche 5 und welcher Tage liegen in dieser Woche.

Gruss Thomas
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14662
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Beitrag von Jan »

Hallo Thomas,

da hast Du ja 2 Probleme zu bewältigen.

1) Welche Woche ist? In Deutschland ist Woche 1 die, wo 4 oder mehr Tage drin sind. Sonst ist es die letzte Woche des Vorjahres. Das lässt sich ja noch relativ leicht berechnen. Wenn Du den ersten Montag kennst ...

2) Welche Tage in der Woche sind ist schon schwieriger. Denn Du musst den Wochentag bestimmen, aber auch Schaltjahre berücksichtigen. Schau Dir da mal den Artikel in Wikipedia unter "Wochentag" an, ob Dir das weiterhilft. Ich hab auch noch folgendes gefunden (ungeprüft!)
- Zunächst verminderst Du das Jahr um 1, wenn das Datum in einem Januar oder Februar liegt.
- Danach muß das Jahr zwischen 1900 und 2099 liegen, ansonsten kommst Du nicht direkt zum Ziel.
- Ist das der Fall, ziehst Du 1900 vom Jahr ab, vergißt also im wesentlichen nur die ersten zwei Stellen.
- Dann teilst Du das Jahr durch 4, rundest das Ergebnis ab, und addierst nochmal das Jahr, den Tag und die zum Monat gehörende Zahl hinzu.
- Das Ergebnis teilst Du durch 7, so daß ein Teilungsrest von 0 bis 6 übrig bleibt, der dem Wochentag entspricht, 0 etwa korresnpondiert zu Sonntag.

Ich habe auch noch den Clipper-Code, um Ostern zu berechnen. Den ausführlicheren für Berechnungen ab 1536 glaube ich (es gibt noch einen, der gilt aber nicht so lange zurück). Wenn Dich das interessiert: Melde Dich einfach.

Jan
Zuletzt geändert von Jan am Di, 24. Okt 2006 17:41, insgesamt 1-mal geändert.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9394
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 105 Mal
Danksagung erhalten: 364 Mal
Kontaktdaten:

Beitrag von Tom »

Hallo, Thomas.

Die erste Kalenderwoche eines Jahres ist diejenige, in der der 4. Januar liegt. Kalenderwochen beginnen in Europa am Montag. Alles andere läßt sich relativ leicht berechnen. Ich benutze die Xbase-Tools, die enthalten Funktionen wie Week() für die Kalenderwoche und viele andere, aber genaugenommen ist das überaus simpel.
Herzlich,
Tom
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15710
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 73 Mal
Danksagung erhalten: 38 Mal
Kontaktdaten:

Beitrag von brandelh »

Tom hat geschrieben:Die erste Kalenderwoche eines Jahres ist diejenige, in der der 4. Januar liegt.
So einfach hat es mir noch keiner erklärt, bisher war ich faul und hab einfach die XbpToolsIII genommen :thumbleft:
Gruß
Hubert
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9394
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 105 Mal
Danksagung erhalten: 364 Mal
Kontaktdaten:

Beitrag von Tom »

Code: Alles auswählen

FUNCTION MyDow(dDate)
* Da sich Dow() auf den Sonntag bezieht, benötigen wir eine Funktion,
* die den Montag als 1 bewertet
IF Dow(dDate) = 1
  RETURN 7
ENDIF
RETURN Dow(dDate)-1

FUNCTION MyBow(dDate)
* gibt den ersten Tag einer Woche zurück (Montag)
Do While MyDow(dDate) > 1
  dDate --
EndDo
RETURN dDate

FUNCTION MyBoY(dDate)
* erster Tag des Jahres
RETURN CtoD("01.01."+Str(Year(dDate),4,0))

FUNCTION Week(dDate)
* errechnet die Kalenderwoche eines Jahres
LOCAL n, dTempDate := MyBoY(dDate) + 3 // 4. Januar
IF dDate >= dTempDate
  n := INT((dDate - MyBow(dTempDate)/7)) + 1
ENDIF
* dDate liegt vor dem 4. Januar
IF MyDow(dDate) > MyDow(dTempDate) // vorige Woche
  RETURN Week(MyBoy(dDate)-1)
ENDIF
RETURN 1
Ohne Gewähr, weil direkt in den Editor getippt.
8)

Kalenderwoche: Week(dDate)
Erster Tag in dieser Woche: MyBow(dDate)
Letzter Tag in dieser Woche: MyBow(dDate)+6
Zuletzt geändert von Tom am Mi, 25. Okt 2006 13:19, insgesamt 1-mal geändert.
Herzlich,
Tom
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15710
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 73 Mal
Danksagung erhalten: 38 Mal
Kontaktdaten:

Beitrag von brandelh »

Tom hat geschrieben:

Code: Alles auswählen

FUNCTION MyBoY(dDate)
* erster Tag des Jahres
RETURN CtoD("01."+Str(Month(dDate),2,0)+"."+Str(Year(dDate),4,0))
hallo ist diese Funktion nicht eher MyBoM() = 1. Tag im Monat
Erster Tag im Jahr sollte das sein:

Code: Alles auswählen

FUNCTION MyBoY(dDate)
* erster Tag des Jahres
RETURN CtoD("01.01."+Str(Year(dDate),4,0))
Gruß
Hubert
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9394
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 105 Mal
Danksagung erhalten: 364 Mal
Kontaktdaten:

Beitrag von Tom »

Stümmt. Wie gesagt, direkt getippt, beim Pizzaessen. Soll ja auch noch ein Lerneffekt dabeisein. :lol:
Herzlich,
Tom
Benutzeravatar
Muecke
1000 working lines a day
1000 working lines a day
Beiträge: 623
Registriert: Di, 24. Okt 2006 7:19
Wohnort: Samstagern CH
Hat sich bedankt: 3 Mal
Danksagung erhalten: 9 Mal
Kontaktdaten:

Beitrag von Muecke »

Danke für Eure Antworten.

Bin schon lange dran.

Ich such eine Lösung, dass wen ich 20 Jan.2006 eingebe, dass ich rausfinde in welcher Woche dies liegt und welche Tage vorhanden sind.

Gruss Thomas
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9394
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 105 Mal
Danksagung erhalten: 364 Mal
Kontaktdaten:

Beitrag von Tom »

Hallo, Thomas.

Wenn Du den oben geposteten Code nimmst, dann gibt Dir:

dDate := Ctod("20.01.2006")
Week(dDate) // die Kalenderwoche dieses Tages (in diesem Fall 3)
MyBow(dDate) // den ersten Tag (Montag)
und demzufolge
MyBow(dDate) + 1 // den zweiten (Dienstag)
bis
MyBow(dDate) + 6 // den letzten (Sonntag)

Was fehlt Dir noch? :?:
Herzlich,
Tom
Benutzeravatar
Muecke
1000 working lines a day
1000 working lines a day
Beiträge: 623
Registriert: Di, 24. Okt 2006 7:19
Wohnort: Samstagern CH
Hat sich bedankt: 3 Mal
Danksagung erhalten: 9 Mal
Kontaktdaten:

Beitrag von Muecke »

Hallo Tom,

hab meine Frage gestellt und gleichzeitig kam schon deine Antwort.

Ist genau was ich gesucht habe super. :razz:
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12913
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

31.12.07 welche KW

Beitrag von AUGE_OHR »

moin,

ich sahe gerade das ich wohl einen BUG in meiner Kalenderwoche Function
hatte den "heute" ist doch wohl die 53 KW und noch nicht die 1 KW ...

also prüft mal eure KW Function ... :)

guten Rutsch ins neue Jahr 2008 (Schaltjahr...)

gruss by OHR
Jimmy

Code: Alles auswählen

sorry ist gaaannnnnz alter Cl*pper Code ...

FUNCTION WOCHEJAHR( m_datum )
**  SYNTAX  : <ExpN> = WOCHEJAHR(<ExpD>)
**  <ExpN>  = Rückgabe Wochen Nummer
**  <ExpD>  = zu bearbeitendes Datum
**
**  ZWECK   : Aus Datum die Kalender Woche des Jahres berechnen
**  HINWEIS : der erste Tag einer Woche ist Montag !
**  BEISPIEL: ? WocheJahr(CTOD("29.11.91"))
LOCAL m_a              // Tag
LOCAL m_woche       // Woche 

   m_a := DOW( CTOD( "31.12." + STR( YEAR( m_datum - 7 ), 4 ) ) )
   m_a := IF( m_a = 1, 7, m_a - 1 )
   m_woche := ROUND( ( m_datum - CTOD( "1.1." + STR( YEAR( m_datum ), 4 ) ) ;
            + 8 - IF( DOW( m_datum ) = 1, 7, DOW( m_datum ) - 1 ) ) / 7, 0 )

*   m_woche := IF( m_woche < 53, m_woche, IF( m_a > 3, m_woche, 1 ) )
   m_woche := IF( m_woche < 54, m_woche, IF( m_a > 3, m_woche, 1 ) )
   m_woche := INT( IF( m_woche = 0, IF( m_a > 4, 52, 53 ), m_woche ) )
Zuletzt geändert von AUGE_OHR am Mo, 31. Dez 2007 1:50, insgesamt 1-mal geändert.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12913
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Beitrag von AUGE_OHR »

hi,
Tom hat geschrieben:

Code: Alles auswählen

FUNCTION MyBoY(dDate)
* erster Tag des Jahres
RETURN CtoD("01.01."+Str(Year(dDate),4,0))
Ohne Gewähr, weil direkt in den Editor getippt. 8)
auch die korrigierte stimmt nicht für heute 31.12.2007

Code: Alles auswählen

PROCEDURE MAIN
LOCAL dDate
SET DATE GERMAN
SET CENTURY ON
CLS

? dDate := DATE()      // 31.12.2007
? MyDow(dDate)
WAIT
RETURN
es kommt auch da schon die 1st KW raus, oder ?

gruss by OHR
Jimmy
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16586
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 116 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Jimmy,
je nach Definition muss das doch auch! Die meisten Tage dieser Woche liegen doch schon im neuen Jahr...

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Muecke
1000 working lines a day
1000 working lines a day
Beiträge: 623
Registriert: Di, 24. Okt 2006 7:19
Wohnort: Samstagern CH
Hat sich bedankt: 3 Mal
Danksagung erhalten: 9 Mal
Kontaktdaten:

Beitrag von Muecke »

Hi Jymmy,

Was man noch ändern sollte ist

Code: Alles auswählen

FUNCTION Week(dDate)          //errechnet die Kalenderwoche eines Jahres
LOCAL n, dTempDate := MyBoY(dDate) + 3 // 4. Januar
   IF dDate >= dTempDate

     n := INT( ( (dDate - MyBow(dTempDate))/7) ) + 1
     [color=red]n := IF(n %53==0 , 1, n )[/color]
     RETURN n
   ENDIF
   * dDate liegt vor dem 4. Januar
   IF MyDow(dDate) > MyDow(dTempDate) // vorige Woche
     RETURN Week(MyBoy(dDate)-1)
   ENDIF
RETURN 1
Danach sollte man die richtigen Kalenderwoche bekommen, wie auch die Tage Montag bis Sonntag.

Gruss Thomas
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12913
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Beitrag von AUGE_OHR »

hi,
Martin Altmann hat geschrieben: je nach Definition muss das doch auch! Die meisten Tage dieser Woche liegen doch schon im neuen Jahr...
hm ... je nach Definition ...
gibt es den die 53th Woche (was ja dann heute wäre) oder gibt es die
nicht ?
Das ab morgen 01.01.08 die erste Woche ist, ist klar.

gruss by OHR
Jimmy
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16586
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 116 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Jimmy,
yup - gibt es! Schau mal hier: http://de.wikipedia.org/wiki/Woche#Z.C3 ... F_ISO_8601

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14662
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Beitrag von Jan »

Hallo Martin,

genau das ist ja auch das Problem: Das die 1. Woche je nach Land/Kontinent/Kulturkreis anders bestimmt wird. Das ist ab und an auch das Problem mit Standard-Software (selbt Excel hatte da schon so diverse Probleme mit).

Jan
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16586
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 116 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Jan,
darum schrieb ich ja auch "je nach Definition" - bei uns ist es üblich, dass die Woche eine 53 bekommt, wenn vier Tage der Woche am Ende des Jahres liegen, sonst wird es eine 1.

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12913
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Beitrag von AUGE_OHR »

hi,
Jan hat geschrieben: In Deutschland ist Woche 1 die, wo 4 oder mehr Tage drin sind. Sonst ist es die letzte Woche des Vorjahres.
so kenne ich das auch, also müsste "heute" doch die "letzte" Woche sein?
( nach ISO 8601 )
Martin hat geschrieben: wenn vier Tage der Woche am Ende des Jahres liegen, sonst wird es eine 1.
hm ... danach wäre es ja doch die 1st KW ...

gruss by OHR
Jimmy
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16586
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 116 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Jimmy,
wieso müsste heute laut Jans Definition die letzte Woche sein?
Heute ist Montag, der erste Tag der Woche und der letzte Tag des Jahres - somit muß die Woche die Nummer 1 haben!

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12913
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Beitrag von AUGE_OHR »

hi,
Martin Altmann hat geschrieben: wieso müsste heute laut Jans Definition die letzte Woche sein?
Heute ist Montag, der erste Tag der Woche und der letzte Tag des Jahres -somit muß die Woche die Nummer 1 haben!
Jetzt hab ich es begriffen :
1 Tag altes Jahr, 6 Tage neues Jahr -> 1 KW
3 Tage altes Jahr, 4 Tage neues Jahr -> 1 KW

4 Tage altes Jahr, 3 Tage neues Jahr -> 53 KW
für ISO 8601

... und die Ami´s haben am 01.01.2029 dann KW 54

gruss by OHR
Jimmy
Zuletzt geändert von AUGE_OHR am Mi, 02. Jan 2008 15:19, insgesamt 1-mal geändert.
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1931
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Beitrag von Rolf Ramacher »

Hallo zusammen,

also ich verwende in einer Menüanzeige folgendes: Damit erhalte ich den Wochentag:

Code: Alles auswählen

   oMenu:addItem( { "Wochentag ???" ,{|| Msgbox(Var2LChar(Date())+CRLF+CRLF+"Heute ist "+CDow(Date()) ) } } ) 
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2950
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 14 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Beitrag von Wolfgang Ciriack »

Hallo Rolf,
und was hat das mit dem Problem zu tun :? :?: :?:
Viele Grüße
Wolfgang
Antworten