Hallo, wie kann ich aus der Angabe der Kalenderwoche den Monat berechnen, in dem diese Woche liegt buw. beginnt? Gibt es dafür einen Algorithmus? Danke für jeden Tip, Ralf.
Hallo, On Sun, 08 Jun 2003 at 18:26 (+0200), Ralf Schneider wrote:
wie kann ich aus der Angabe der Kalenderwoche den Monat berechnen, in dem diese Woche liegt buw. beginnt? Gibt es dafür einen Algorithmus?
Du solltest schreiben, in welcher Programmiersprache Du das realisieren willst. In der Regel stellen Programmiersprachen Mechanismen bereit, so etwas einfach zu realisieren. Oft gibt es auch passende Bibliotheken. Gruss, Bernhard -- _________ http://www.bwalle.de _________________________________________________ "Mit dem Geist ist es wie mit dem Magen: Man kann ihm nur Dinge zumuten, die er verdauen kann." -- Winston Churchill
Am Sonntag, 8. Juni 2003 19:24 schrieb Bernhard Walle:
Hallo,
On Sun, 08 Jun 2003 at 18:26 (+0200), Ralf Schneider wrote:
wie kann ich aus der Angabe der Kalenderwoche den Monat berechnen, in dem diese Woche liegt buw. beginnt? Gibt es dafür einen Algorithmus?
Du solltest schreiben, in welcher Programmiersprache Du das realisieren willst. In der Regel stellen Programmiersprachen Mechanismen bereit, so etwas einfach zu realisieren. Oft gibt es auch passende Bibliotheken.
Eigentlich ist das Problem ja erstmal unabhängig von der Programmiersprache, aber na gut: Implementieren möchte ich das in C++ und hier verwende ich Qt. Die Klasse QDate hat zwar allerlei nette Methoden, z.B. auch weekNumber() zum ermitteln der Kalenderwoche, aber was ich brauche, ist das Pendant setWeekNumber(), um in einem Kalender-Widget in die gewünschte Woche zu springen. Viele Grüße, Ralf.
On Sun, 08 Jun 2003 at 20:53 (+0200), Ralf Schneider wrote:
Am Sonntag, 8. Juni 2003 19:24 schrieb Bernhard Walle:
On Sun, 08 Jun 2003 at 18:26 (+0200), Ralf Schneider wrote:
wie kann ich aus der Angabe der Kalenderwoche den Monat berechnen, in dem diese Woche liegt buw. beginnt? Gibt es dafür einen Algorithmus?
Du solltest schreiben, in welcher Programmiersprache Du das realisieren willst. In der Regel stellen Programmiersprachen Mechanismen bereit, so etwas einfach zu realisieren. Oft gibt es auch passende Bibliotheken.
Eigentlich ist das Problem ja erstmal unabhängig von der Programmiersprache, aber na gut: Implementieren möchte ich das in C++ und hier verwende ich Qt.
Eigentlich schon, nur gibt es halt vielleicht Sprachen in denen Bibliotheken zur Verfuegung stehen in denen sowas mit einem Einzeiler erledigt ist. Konkret dachte ich an Date::Calc von Perl (damit kenne ich mich etwas aus, siehe Homepage).
Die Klasse QDate hat zwar allerlei nette Methoden, z.B. auch weekNumber() zum ermitteln der Kalenderwoche, aber was ich brauche, ist das Pendant setWeekNumber(), um in einem Kalender-Widget in die gewünschte Woche zu springen.
Nun, da ich mich mit QT nicht besonders auskenne habe ich mal eine Methode in Java Programmiert, die das Ganze leisten sollte. ,----[ DateExtended.java ]- | import java.util.*; | import java.text.*; | | class DateExtended { | | public static Date getFirstDayOfWeek (int year, int week) { | | // gesucht ist der Montag der Kalenderwoche 1 | // dazu: Neujahr ermitteln | GregorianCalendar neujahr = new GregorianCalendar(year, Calendar.JANUARY, 1); | int wochentag = neujahr.get(Calendar.DAY_OF_WEEK); | | // Korrektur damit 1 = Montag, ..., 7 = Sonntag | // evtl. nicht in QT noetig | wochentag = wochentag >= 2 ? wochentag - 1 : 7; | | // Ermittlung des Montages der Kalenderwoche 1 | // Dazu Fallunterscheidung. Nach DIN/ISO-Norm. | GregorianCalendar mondayOfFirstWeek = wochentag > 4 | ? new GregorianCalendar(year, Calendar.JANUARY, 9 - wochentag) | : new GregorianCalendar(year-1, Calendar.DECEMBER, 33 - wochentag); | | // Nun hochzaehlen. In anderen Programmiersprachen evtl. komplizierter. | mondayOfFirstWeek.add(Calendar.DATE, 7*(week-1)); | | return mondayOfFirstWeek.getTime(); | } | | public static void main (String[] args) { | DateFormat df = DateFormat.getDateInstance(); | | int year = 2003, week = 1; | if (args.length >= 2) { | year = Integer.parseInt(args[0]); | week = Integer.parseInt(args[1]); | } else { | System.err.println("Fehler. Bitte Parameter angeben."); | System.exit(1); | } | | System.out.println(df.format(getFirstDayOfWeek(year, week))); | } | | } `---- Zum Testen: [~] $ java DateExtended 1998 12 16.03.1998 [~] $ java DateExtended 2003 24 09.06.2003 Das Ganze sollte sich ohne groessere Schwierigkeiten auch in C++/QT umsetzen lassen. Falls Du irgendwelche Fehler findest waere es nett wenn Du es auf der Liste posten koenntest. BTW: Du bist nicht zufaellig der c't-Ralf Schneider? Gruss, Bernhard -- _________ http://www.bwalle.de _________________________________________________ I've no idea when Linus is going to release 2.0.24, but if he takes too long I'm going to release a 2.0.24unoff and he can sound off all he likes. -- Alan Cox
Am Sonntag, 8. Juni 2003 21:52 schrieb Bernhard Walle:
Die Klasse QDate hat zwar allerlei nette Methoden, z.B. auch weekNumber() zum ermitteln der Kalenderwoche, aber was ich brauche, ist das Pendant setWeekNumber(), um in einem Kalender-Widget in die gewünschte Woche zu springen.
Nun, da ich mich mit QT nicht besonders auskenne habe ich mal eine Methode in Java Programmiert, die das Ganze leisten sollte.
Danke, werde ich mir morgen mal in Ruhe ansehen. [...]
Das Ganze sollte sich ohne groessere Schwierigkeiten auch in C++/QT umsetzen lassen.
Davon bin ich überzeugt :-)
Falls Du irgendwelche Fehler findest waere es nett wenn Du es auf der Liste posten koenntest.
Aber sicher doch...
BTW: Du bist nicht zufaellig der c't-Ralf Schneider?
Nein, bin ich nicht. Die Namenskombination ist mir schon öfter über den Weg gelaufen :-) Viele Grüße, Ralf.
Am Sonntag, 8. Juni 2003 21:52 schrieb Bernhard Walle:
Das Ganze sollte sich ohne groessere Schwierigkeiten auch in C++/QT umsetzen lassen.
Ja, sieht dann in etwa so aus: void CDatePicker::slotWeekChanged (int week) { QDate newYear, mondayOfFirstWeek; int weekday; //------------------------------------------------------------------------ // Find out the weekday of new-year. //------------------------------------------------------------------------ newYear.setYMD (mCurrentDate.year(), 1, 1); weekday = newYear.dayOfWeek(); //------------------------------------------------------------------------ // Find out the monday of the first week of the year. //------------------------------------------------------------------------ if (weekday > 4) mondayOfFirstWeek.setYMD (mCurrentDate.year(), 1, 9 - weekday); else mondayOfFirstWeek.setYMD (mCurrentDate.year() - 1, 12, 33 - weekday); //------------------------------------------------------------------------ // Add the number of days (week * 7 days per week). //------------------------------------------------------------------------ mCurrentDate = mondayOfFirstWeek.addDays (7 * week); updatePicker(); } updatePicker() zeigt dann anhand von mCurrentDate den entsprechenden Monat im Date-Picker-Widget an. Dein Code scheint ohne Fehler zu funktionieren. Vielen Dank, Ralf.
Hallo, On Sun, 08 Jun 2003, Ralf Schneider wrote:
Die Klasse QDate hat zwar allerlei nette Methoden, z.B. auch weekNumber() zum ermitteln der Kalenderwoche, aber was ich brauche, ist das Pendant setWeekNumber(), um in einem Kalender-Widget in die gewünschte Woche zu springen.
Du suchst also eigentlich eine Funktion "Date2WeekOfYear()"? Wie die Kalenderwoche berechnet wird ist in irgendwelchen ISO/DIN Standards[2] definiert (IIRC ist die KW 1 die, in der der erste Do. des Jahres liegt)... Schau dir doch mal die Quellen von den Perl-Modulen Date::* an, bes. Date::Calc [1] duerfte interessant vom noetigen Algorithmus sein. Die Quellen von 'date' sind aber sicher auch einen Blick wert. Vielleicht reicht dir aber auch schon o.g. Definition der KWoche. -dnh [1] siehe CPAN (http://www.cpan.org/), download z.B. per perl -MCPAN -e'get Date::Calc' oder eben auch "per Hand" (eine Zeile): ftp://ftp.gwdg.de/pub/languages/perl/CPAN /sources/authors/id/S/ST/STBEY/Date-Calc-5.3.tar.gz [2] *hehe* hab zufaellig grad die Date::Calc Quellen rumfahren, da findet sich u.a. als Kommentar: /* Gregorian calendar date calculations in compliance with */ /* ISO/R 2015-1971, DIN 1355 and (to some extent) ISO 8601. */ -- Aus der Beschreibung entnehme ich, daß deine Fonts nach Typ 3 konvertiert werden (Finger im Hals) und deine Bilder auf Screen-Qualität (Fuß zum Finger dazusteck...) -- ratti in suse-linux
Am Sonntag, 8. Juni 2003 22:18 schrieb David Haller:
Die Klasse QDate hat zwar allerlei nette Methoden, z.B. auch weekNumber() zum ermitteln der Kalenderwoche, aber was ich brauche, ist das Pendant setWeekNumber(), um in einem Kalender-Widget in die gewünschte Woche zu springen.
Du suchst also eigentlich eine Funktion "Date2WeekOfYear()"?
Nein, wie ich schon sagte gibt es die schon bei QDate und heißt weekNumber(). Ich suche eher WeekOfYear2Date(). Viele Grüße, Ralf.
Hallo, On Sun, 08 Jun 2003, Ralf Schneider wrote:
Am Sonntag, 8. Juni 2003 22:18 schrieb David Haller:
Die Klasse QDate hat zwar allerlei nette Methoden, z.B. auch weekNumber() zum ermitteln der Kalenderwoche, aber was ich brauche, ist das Pendant setWeekNumber(), um in einem Kalender-Widget in die gewünschte Woche zu springen.
Du suchst also eigentlich eine Funktion "Date2WeekOfYear()"?
Nein, wie ich schon sagte gibt es die schon bei QDate und heißt weekNumber(). Ich suche eher WeekOfYear2Date().
Und welchen Tag willst du dazu nehmen? Die genannten Dinge sollten aber auch bei dieser Umkehrung helfen. -dnh PS: Schick mir bitte keine PM, wenn du an die Liste antwortest. -- Erst muss mein Arzt sein ok geben. Aber er ist zuversichtlich und die Leute hier sind echt ok, der Raum hat ganz toll weiche Waende und von den bunten Tabletten sieht man ganz tollte Farben und fuehlt sich ganz ruhig. -- Jens Link
Hallo, On Sun, 08 Jun 2003 at 23:52 (+0200), David Haller wrote:
On Sun, 08 Jun 2003, Ralf Schneider wrote:
Am Sonntag, 8. Juni 2003 22:18 schrieb David Haller:
Die Klasse QDate hat zwar allerlei nette Methoden, z.B. auch weekNumber() zum ermitteln der Kalenderwoche, aber was ich brauche, ist das Pendant setWeekNumber(), um in einem Kalender-Widget in die gewünschte Woche zu springen.
Du suchst also eigentlich eine Funktion "Date2WeekOfYear()"?
Nein, wie ich schon sagte gibt es die schon bei QDate und heißt weekNumber(). Ich suche eher WeekOfYear2Date().
Und welchen Tag willst du dazu nehmen?
sorry, aber Du solltest mal das Ursprungsposting (und die Folgepostings von Ralf) lesen, da steht eigentlich alles drin. Ralf moechte in einem Kalenderwidget in QT eine Woche anhand der Nummer anspringen, also Benutzer gibt KW 20, Jahr 2003 ein und das Kalender- widget soll's anzeigen. Da das Widget aber keine Methode zum Anspringen per Woche hat, moechte Ralf einen Algorithmus implementieren, der anhand Woche und Jahr das Datum des ersten Wochentages (also Montages) ausgibt. Anhand des Datums kann nun die betreffende Woche angesprungen werden. So hab ich's jedenfalls verstanden. :-)
Die genannten Dinge sollten aber auch bei dieser Umkehrung helfen.
Naja, soo kompliziert ist es nun auch wieder nicht als dass man sich da tonnenweise Quellcode runterladen und inspizieren muesste. Ausserdem hat man dann schneller ein Problem mit dem Copyright als einem lieb ist. Mag sein dass mein Weg nicht sonderlich effizient ist, aber wenn's um GUIs geht in denen das Programm sowieso 90 % auf Benutzereingaben wartet ist das wohl egal. Gruss, Bernhard -- _________ http://www.bwalle.de _________________________________________________ Bohrer für Öl? Sie meinen, in die Erde bohren und versuchen Öl zu finden? Sie sind verrückt!. -- Bohr-Arbeiter vor dem ersten Öl-Bohr-Projekt (1859)
Am Montag, 9. Juni 2003 10:54 schrieb Bernhard Walle:
Und welchen Tag willst du dazu nehmen?
sorry, aber Du solltest mal das Ursprungsposting (und die Folgepostings von Ralf) lesen, da steht eigentlich alles drin.
Ralf moechte in einem Kalenderwidget in QT eine Woche anhand der Nummer anspringen, also Benutzer gibt KW 20, Jahr 2003 ein und das Kalender- widget soll's anzeigen. Da das Widget aber keine Methode zum Anspringen per Woche hat, moechte Ralf einen Algorithmus implementieren, der anhand Woche und Jahr das Datum des ersten Wochentages (also Montages) ausgibt. Anhand des Datums kann nun die betreffende Woche angesprungen werden.
So hab ich's jedenfalls verstanden. :-)
Exakt!!! Viele Grüße, Ralf.
Moin, Am Son, 2003-06-08 um 18.26 schrieb Ralf Schneider:
Hallo,
wie kann ich aus der Angabe der Kalenderwoche den Monat berechnen, in dem diese Woche liegt buw. beginnt? Gibt es dafür einen Algorithmus?
Programmiersprache? Guck dir mal "date" in der Shell an. Das kann z.B. sowas:
date "+%W" --date="2003/6/30" 26
Ich weiss, daß die Angaben für --date sehr obskur sein können, z.B. "yesterday - 30 days", vielleicht gibt es da ja was für dein Problem. Gruß, Ratti -- -o) fontlinge | Font management for Linux | Schriftenverwaltung in Linux /\\ http://freshmeat.net/projects/fontlinge/ _\_V http://www.gesindel.de https://sourceforge.net/projects/fontlinge/
Am Sonntag, 8. Juni 2003 20:05 schrieb Joerg Rossdeutscher:
Programmiersprache?
Ist erstmal uninteressant, mich interessiert der prinzipielle Weg der Lösung.
Guck dir mal "date" in der Shell an. Das kann z.B. sowas:
date "+%W" --date="2003/6/30"
Das ist aber nicht portabel und scheidet damit aus. Letztendlich soll der Algorithmus mit C++ und Qt realisiert werden. Viele Grüße, Ralf.
Moin, Am Son, 2003-06-08 um 20.56 schrieb Ralf Schneider:
Am Sonntag, 8. Juni 2003 20:05 schrieb Joerg Rossdeutscher:
Guck dir mal "date" in der Shell an. Das kann z.B. sowas:
date "+%W" --date="2003/6/30"
Das ist aber nicht portabel und scheidet damit aus.
z-z-z. OpenSource. :-) Gruß, Ratti -- -o) fontlinge | Font management for Linux | Schriftenverwaltung in Linux /\\ http://freshmeat.net/projects/fontlinge/ _\_V http://www.gesindel.de https://sourceforge.net/projects/fontlinge/
Am Sonntag, 8. Juni 2003 22:23 schrieb Joerg Rossdeutscher:
Das ist aber nicht portabel und scheidet damit aus.
z-z-z. OpenSource. :-)
Was hat OpenSource mit Portabilität zu tun? Nicht sehr viel, oder? Und mit Qt ist es ein leichtes, eine unter Linux entwickelte Anwendung nach Windows zu portieren :-) Viele Grüße, Ralf.
On Sun, 08 Jun 2003 at 22:57 (+0200), Ralf Schneider wrote:
Am Sonntag, 8. Juni 2003 22:23 schrieb Joerg Rossdeutscher:
Das ist aber nicht portabel und scheidet damit aus.
z-z-z. OpenSource. :-)
Was hat OpenSource mit Portabilität zu tun? Nicht sehr viel, oder? Und mit Qt ist es ein leichtes, eine unter Linux entwickelte Anwendung nach Windows zu portieren :-)
Er meint Du kannst Dir den Quellcode von `date' anschauen und die betreffenden Teile einfach uebernehmen. Allerdings heisst OpenSource nicht unbedingt dass man sich ueberall was zurechtklauen darf, wenn Du z. B. Dein Problem unter eine BSD-artige Lizenz stellst und GPL-Code nimmst hast Du ein ernstes Problem. Auch umgekehrt: ich darf z. B. den BSD-Daemon nicht in Muttprint integrieren, weil Muttprint unter der GPL und der Daemon unter der BSD- Lizenz steht. Ich muesste irgendwie getrennte Downloadarchive machen oder so, was mir dann auch zu bloed war. (Ist zwar kein Quellcode sondern nur ein Bild aber nur mal so als Beispiel.) Gruss, Bernhard -- _________ http://www.bwalle.de _________________________________________________ All the existing 2.0.x kernels are to buggy for 2.1.x to be the main goal. -- Alan Cox
Am Sonntag, 8. Juni 2003 23:08 schrieb Bernhard Walle:
Was hat OpenSource mit Portabilität zu tun? Nicht sehr viel, oder? Und mit Qt ist es ein leichtes, eine unter Linux entwickelte Anwendung nach Windows zu portieren :-)
Er meint Du kannst Dir den Quellcode von `date' anschauen und die betreffenden Teile einfach uebernehmen.
Ok, hatte ich falsch verstanden :-( Viele Grüße, Ralf.
Moin, Am Son, 2003-06-08 um 22.57 schrieb Ralf Schneider:
Am Sonntag, 8. Juni 2003 22:23 schrieb Joerg Rossdeutscher:
Das ist aber nicht portabel und scheidet damit aus.
z-z-z. OpenSource. :-)
Was hat OpenSource mit Portabilität zu tun?
'date' an der Kommandozeile ist sicher nicht sonderlich portabel. Aber da Opensource: Du kannst dir den Code "mopsen", und der dürfte ziemlich portabel sein, da er ja "nur" rechnet und eine Zeile Text nach STDOUT schreibt. Gruß, Ratti -- -o) fontlinge | Font management for Linux | Schriftenverwaltung in Linux /\\ http://freshmeat.net/projects/fontlinge/ _\_V http://www.gesindel.de https://sourceforge.net/projects/fontlinge/
On Sunday 08 June 2003 20:56, Ralf Schneider wrote:
Letztendlich soll der Algorithmus mit C++ und Qt realisiert werden.
QDate::weekNumber() kann es ja leider nur andersherum...
So aus dem Bauch heraus würde ich sagen, so ungefähr sollte das funktionieren
(ungetestet, probier's mal aus):
int monthOfWeek( int year, int week )
{
QDate date( year, 1, 1 );
date.addDays( (week-1) * 7 );
return date.month();
}
Oder habe ich da was übersehen?
Übrigens: Wochenanfang ist bei uns der Montag, in den USA der Sonntag, soviel
ich weiß; das macht das evtl. ein bißchen unzuverlässig. Qt sagt dazu:
"In accordance with ISO 8601, weeks start on Monday and the first Thursday of
a year is always in week 1 of that year. Most years have 52 weeks, but some
have 53."
Das könnte auch noch problematisch sein, d.h. man muß zusätzlich zum Monat
auch noch das Jahr berücksichtigen (d.h. evtl. das ganze QDate() zurückgeben,
nicht nur QDate::month() ):
"yearNumber is not always the same as year(). For example, 1 January 2000 has
week number 52 in the year 1999, and 31 December 2002 has week number 1 in
the year 2003."
CU
--
Stefan Hundhammer
On Tue, 10 Jun 2003 at 11:39 (+0200), Stefan Hundhammer wrote:
On Sunday 08 June 2003 20:56, Ralf Schneider wrote:
Letztendlich soll der Algorithmus mit C++ und Qt realisiert werden.
QDate::weekNumber() kann es ja leider nur andersherum...
So aus dem Bauch heraus würde ich sagen, so ungefähr sollte das funktionieren (ungetestet, probier's mal aus):
int monthOfWeek( int year, int week ) { QDate date( year, 1, 1 ); date.addDays( (week-1) * 7 ); return date.month(); }
Der erste Januar muss nicht unbedingt in der 1. Woche liegen (wenn z. B. der 01.01. ein Samstag ist dann ist der 03.01. der Beginn der 1. Woche). Ein Beispiel in Java habe ich ja schon gepostet, das macht's richtig (wenn man von ISO ausgeht und die amerikanische Konvention aussen vor laesst). Gruss, Bernhard -- _________ http://www.bwalle.de _________________________________________________ "I might disagree with what you have to say, but I'll defend to the death your right to say it." -- Voltaire
Am Dienstag, 10. Juni 2003 12:01 schrieb Bernhard Walle:
Ein Beispiel in Java habe ich ja schon gepostet, das macht's richtig
Sorry, bin noch nicht dazu gekommen, mir das mal etwas genauer anzuschauen. Ich poste dann hier mal den C++-Code, wenn er funktioniert.
(wenn man von ISO ausgeht und die amerikanische Konvention aussen vor laesst).
Wen interessiert schon die amerikanische Konvention :-) Wo ist eigentlich Amerika :-) Viele Grüße, Ralf.
On Tuesday 10 June 2003 12:33, Ralf Schneider wrote:
Wo ist eigentlich Amerika :-)
Die Erde ist ein Würfel, das weiß doch wirklich jeder - und Amerika geht über
drei Ecken davon, darum ist dort alles ein bißchen komisch.
;-)
CU
--
Stefan Hundhammer
participants (5)
-
Bernhard Walle
-
David Haller
-
Joerg Rossdeutscher
-
Ralf Schneider
-
Stefan Hundhammer