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