Berechnung der Kalenderwoche



  • Hi alle,
    hat jemand einen einfachen algorithmus zur berechnung der kalenderwoche. ich danke euch in voraus



  • wenn du bis morgen warten kannst, poste ich eine klasse die ich mal geschrieben hab. liegt auf der arbeit 🙂



  • @andoodezoc

    Immer erst im Forum suchen... denn vielleicht hat schon jemand so eine Frage gestellt:

    Welch ein Zufall... jemand hat... ja ist es denn die Möglichkeit :

    Datum manupilation - Kalenderwoche&Wochentag

    MfG veganza



  • int Logfile::getWeekOfYear(COleDateTime &dt)
    {
        //Montag als Wochenanfang
        int weekBeginn = dt.GetDayOfYear()-dt.GetDayOfWeek();
        int n = 1;
        int rest = weekBeginn;
    
        while(rest>0){
            rest = weekBeginn-7*n;
            n++;
        }
        if(dt.GetDayOfWeek() == 1 /*Sonntag*/ )n--;
        return n;
    }
    

    so hab ich's gemacht...



  • @thelonius

    while(rest>0){
      rest = weekBeginn-7*n;
      n++;
    }
    

    Oje, so ist es selbst möglich, aus einer einfachen Division eine 'komplizierte' Schleife zu machen!



  • Moin,
    ich frage mich ob da wirklich die "gesetzlich-verankerten" Kalenderwochenrechnung abgebildet wird. Es gibt nämlich eine Regel von der es abhängig ist mit welcher Kalenderwoche das jahr beginnt. Ausschlaggebend ist der Wochentag vom 1.1. Ein Jahr kann also durchaus der Woche 52 oder 53 (weiss das nicht mehr so genau...)oder 1 beginnen. Ebenso ist es möglich - wie z.B. in diesem Jahr - dass der 31.12 schon in der 1.Kalenderwoche des Folgejahres liegt.
    Nur mal so zu Nachdenken...

    Gruß, Tom



  • //Die aktuelle Jahreswoche liefern
    	unsigned short int telstat::getWeekOfYear()
    	{
    		unsigned short int ret = 0;
    		char weekOfYear[2];
    		time_t sin1970;
    		struct tm *ts;
    
    		sin1970 = time(NULL);
    		ts = localtime(&sin1970);
    
    		if(strftime(weekOfYear,3,"%W",ts)<0) {
    			std::cerr << "Ausnahmefehler: Ungueltige Kalenderwoche." << std::endl;
    			exit(-1);
    		}
    		ret=atoi(weekOfYear)+1;
    
    	 return ret;
    	}
    

  • Mod



  • Hier hab ich mal etwas ist zwar nicht gut Kommentiert aber ich glaub das man
    damit zurecht kommt.

    Berechnet die Kalenderwoche nach DIN 1535 oder so ähnlich.

    H-Datei

    #pragma once
    #include "atlcomtime.h"
    
    // Klasse von COleDateTime abgeleitet
    class AFX_EXT_CLASS CMyDateTime :
    	public COleDateTime
    {
    public:
    	CMyDateTime(void);
    	~CMyDateTime(void);
    	// Zuweisungsoperator
    	const CMyDateTime& operator=(const COleDateTime& date);
    
    protected:
    	// Hier die eigentliche Berechnung der Kalenderwoche nach DIN 1535
    	int KalW(void);
    
    public:	
    
    	//int ISOWeek(void);
    
    	// Übergabe als String in der Form TT.MM.JJJJ
    	int ISOWeek(const CString& str);
    
    	// Übergabe als COleDateTime Referenz
    	int ISOWeek(COleDateTime& dt);
    
    	// Übergabe als Jahr Monat und Tag als String
    	int ISOWeek(const CString& sYear, const CString& sMonth, const CString& sDay);
    
    	// Jahr Monat Tag als int
    	int ISOWeek(int iYear, int iMonth, int iDay);
    
    	// Gibt 0 oder 1 zurück ob das jahr ein Schaltjahr ist
    	int GetLeapYear(void);
    };
    

    Cpp-Datei

    #include "StdAfx.h"
    #include "mydatetime.h"
    #include <stdlib.h>
    
    CMyDateTime::CMyDateTime(void)
    {
    }
    
    CMyDateTime::~CMyDateTime(void)
    {
    }
    
    // Zuweisungsoperator
    const CMyDateTime& CMyDateTime::operator=(const COleDateTime& date)
    {
    	if( this == &date )
    		return *this;
    
    	m_dt = date.m_dt;
    	return *this;
    }
    
    //int CMyDateTime::ISOWeek(void)
    //{
    //	return KalW();
    //}
    
    // Übergabe als String in der Form TT.MM.JJJJ
    int CMyDateTime::ISOWeek(const CString& str)
    {
    	ParseDateTime(str);
    
    	return KalW();
    }
    
    // Übergabe als COleDateTime Referenz
    int CMyDateTime::ISOWeek(COleDateTime& dt)
    {
    	m_dt = dt.m_dt;
    
    	return KalW();
    }
    
    // Übergabe als Jahr Monat und Tag als String
    int CMyDateTime::ISOWeek(const CString& sYear, 
    						 const CString& sMonth, 
    						 const CString& sDay)
    {
    
    	SetDate(atoi(sYear), atoi(sMonth), atoi(sDay));
    
    	return KalW();
    }
    
    // Jahr Monat Tag als int
    int CMyDateTime::ISOWeek(int iYear, int iMonth, int iDay)
    {
    	SetDate(iYear, iMonth, iDay);
    
    	return KalW();
    }
    
    // Gibt 0 oder 1 zurück ob das jahr ein Schaltjahr ist
    int CMyDateTime::GetLeapYear(void)
    {
    	return GetYear()%4 == 0 && GetYear()%100 != 0 || GetYear()%400 == 0;
    }
    
    int CMyDateTime::KalW(void)
    {
    	ASSERT(m_dt != 0.0);
    	if( m_dt == 0.0 )
    		return -1;
    
    	COleDateTime year, tmp;
    	int iDt;
    
    	year = (m_dt + ( 8 - GetDayOfWeek()) % 7 - 3);
    
    	tmp.SetDate(year.GetYear(), 1, 1);
    
    	iDt = (int)(m_dt - tmp.m_dt - 3 + (tmp.GetDayOfWeek() + 1) % 7)/7+1;
    
    	return iDt;
    }
    

    Ich hoffe das ihr damit klar kommt.

    Gruß Jochen


Anmelden zum Antworten