web-dev-qa-db-de.com

Wie berechne ich die Wochennummer für ein Datum?

Wenn ich ein Datum habe, wie berechne ich die Wochennummer für dieses Datum innerhalb dieses Jahres?

Zum Beispiel in 2008 vom 1. Januar bis zum 6. Januar in der ersten Woche und vom 7. bis zum 13. Januar in der zweiten Woche. Wenn mein Datum der 10. Januar 2008 war, wäre meine Wochennummer 2.

Ein Algorithmus wäre großartig, um mich anzufangen, und Beispielcode würde auch helfen - ich entwickle in C++ unter Windows.

Verbunden:

Abrufen der Wochennummer eines Datums in MS SQL Server 2005?

25
Big GH

Pseudocode:

int julian = getDayOfYear(myDate)  // Jan 1 = 1, Jan 2 = 2, etc...
int dow = getDayOfWeek(myDate)     // Sun = 0, Mon = 1, etc...
int dowJan1 = getDayOfWeek("1/1/" + thisYear)   // find out first of year's day
// int badWeekNum = (julian / 7) + 1  // Get our week# (wrong!  Don't use this)
int weekNum = ((julian + 6) / 7)   // probably better.  CHECK THIS LINE. (See comments.)
if (dow < dowJan1)                 // adjust for being after Saturday of week #1
    ++weekNum;
return (weekNum)

Der Algorithmus geht davon aus, dass Sie Ihre Wochen wie folgt nummerieren:

S  M  T  W  R  F  S
            1  2  3    <-- week #1
4  5  6  7  8  9 10    <-- week #2
[etc.]

getDayOfWeek () und getDayOfYear () sind in den meisten Sprachen Standardoperationen für Datumsobjekte. Wenn Ihre nicht vorhanden ist, können Sie von einem bekannten Datum aus vorwärtszählen (der 1. Januar 1970 ist ein übliches Datum), nachdem Sie nachgesehen haben, an welchem ​​Wochentag es war.

Wenn Sie Ihre eigenen Datumszählroutinen implementieren, denken Sie daran, dass Jahre, die durch 100 teilbar sind, NICHT Schaltjahre sind, es sei denn, sie sind auch durch 400 teilbar. 1900 war also kein Schaltjahr, sondern 2000 war. Wenn Sie weit in der Vergangenheit arbeiten, müssen Sie sich mit gregorianischen vs. julianischen Kalendern usw. herumärgern. Weitere Informationen hierzu finden Sie in Wikipedia .

Dieser Link spricht ausführlicher über Datums-/Uhrzeitfunktionen in Windows/C++.

15
Olie

Seien Sie sich bewusst, dass Ihre Definition von nth Woche des Jahres zwar haltbar ist, aber nicht "der" Standard ist.

ISO 8601 definiert einen Standard für die Darstellung von Datumsangaben, Zeitangaben und Zeitzonen. Es definiert die Wochen, die an einem Montag beginnen. Es heißt auch, dass Woche 1 eines Jahres diejenige ist, die mindestens 4 Tage ab dem angegebenen Jahr enthält. Folglich könnten sich der 29., 30. und 31. Dezember 20xx in Woche 1 von 20xy befinden (wobei xy = xx + 1 ist), und der 1., 2. und 3. Januar 20xy könnte sich alle in der letzten Woche von 20xx befinden. Außerdem kann es eine Woche 53 geben.

[ Added : Beachten Sie, dass der C-Standard und die `strftime () - Funktion Wochen, die am Sonntag beginnen, sowie Wochen, die am Montag beginnen, vorsehen. Es ist nicht klar, dass der C-Standard für die Sonntagswochen die Jahreszahl der Woche 0 vorsieht. Siehe auch die Antwort von Emerick Rogul.]

Dann kommt die interessante Testphase - wann bekommst du die Woche 53? Eine Antwort gibt es am Freitag, dem 1. Januar 2010, der in 2009-W53 ist (wie, Ist tatsächlich Sonntag, der 3. Januar 2010). In ähnlicher Weise ist Samstag, der 1. Januar 2005 in W53, aber Sonntag der 1. Januar 2006 in W52.

Dies ist ein Auszug aus einem Kommentar im folgenden Code, der sich eigentlich in Informix SPL (Stored Procedure Language) befindet, aber lesbar ist, obwohl er wahrscheinlich nicht schreibbar ist, ohne viel weitere Erklärung. Das '||' Operator ist die SQL-Zeichenfolgenverkettung, und Sonntag ist Tag 0, Montag ist Tag 1, ... Samstag ist Tag 6 der Woche. In den Kommentaren sind ausführliche Anmerkungen enthalten, einschließlich relevanter Texte aus der Norm. Einzeilige Kommentare beginnen '--'; möglicherweise mehrzeilige Kommentare beginnen mit '{' und enden mit dem nächsten '}'.

-- @(#)$Id: iso8601_weekday.spl,v 1.1 2001/04/03 19:34:43 jleffler Exp $
--
-- Calculate ISO 8601 Week Number for given date
-- Defines procedure: iso8601_weekday().
-- Uses procedure: iso8601_weeknum().

{
According to a summary of the ISO 8601:1988 standard "Data Elements and
Interchange Formats -- Information Interchange -- Representation of
dates and times":

    The week notation can also be extended by a number indicating the
    day of the week.  For example the day 1996-12-31 which is the
    Tuesday (day 2) of the first week of 1997 can also be written as

        1997-W01-2 or 1997W012

    for applications like industrial planning where many things like
    shift rotations are organized per week and knowing the week number
    and the day of the week is more handy than knowing the day of the
    month.

This procedure uses iso8601_weeknum() to format the YYYY-Www part of the
date, and appends '-d' to the result, allowing for Informix's coding of
Sunday as day 0 rather than day 7 as required by ISO 8601.
}

CREATE PROCEDURE iso8601_weekday(dateval DATE DEFAULT TODAY) RETURNING CHAR(10);
    DEFINE rv CHAR(10);
    DEFINE dw CHAR(4);
    LET dw = WEEKDAY(dateval);
    IF dw = 0 THEN
            LET dw = 7;
    END IF;
    RETURN iso8601_weeknum(dateval) || '-' || dw;
END PROCEDURE;
-- @(#)$Id: iso8601_weeknum.spl,v 1.1 2001/02/27 20:36:25 jleffler Exp $
--
-- Calculate ISO 8601 Week Number for given date
-- Defines procedures: day_one_week_one() and iso8601_weeknum().

{
According to a summary of the ISO 8601:1988 standard "Data Elements and
Interchange Formats -- Information Interchange -- Representation of
dates and times":

    In commercial and industrial applications (delivery times,
    production plans, etc.), especially in Europe, it is often required
    to refer to a week of a year.  Week 01 of a year is per definition
    the first week which has the Thursday in this year, which is
    equivalent to the week which contains the fourth day of January.  In
    other words, the first week of a new year is the week which has the
    majority of its days in the new year.  Week 01 might also contain
    days from the previous year and the week before week 01 of a year is
    the last week (52 or 53) of the previous year even if it contains
    days from the new year.  A week starts with Monday (day 1) and ends
    with Sunday (day 7).  For example, the first week of the year 1997
    lasts from 1996-12-30 to 1997-01-05 and can be written in standard
    notation as

        1997-W01 or 1997W01

    The week notation can also be extended by a number indicating the
    day of the week.  For example the day 1996-12-31 which is the
    Tuesday (day 2) of the first week of 1997 can also be written as

        1997-W01-2 or 1997W012

    for applications like industrial planning where many things like
    shift rotations are organized per week and knowing the week number
    and the day of the week is more handy than knowing the day of the
    month.

Referring to the standard itself, section 3.17 defines a calendar week:

    week, calendar: A seven day period within a calendar year, starting
    on a Monday and identified by its ordinal number within the year;
    the first calendar week of the year is the one that includes the
    first Thursday of that year.  In the Gregorian calendar, this is
    equivalent to the week which includes 4 January.

Section 5.2.3 "Date identified by Calendar week and day numbers" states:

    Calendar week is represented by two numeric digits.  The first
    calendar week of a year shall be identified as 01 [...]

    Day of the week is represented by one decimal digit.  Monday
    shall be identified as day 1 of any calendar week [...]

Section 5.2.3.1 "Complete representation" states:

    When the application clearly identifies the need for a complete
    representation of a date identified by calendar week and day
    numbers, it shall be one of the alphanumeric representations as
    follows, where CCYY represents a calendar year, W is the week
    designator, ww represents the ordinal number of a calendar week
    within the year, and D represents the ordinal number within the
    calendar week.

    Basic format: CCYYWwwD
        Example: 1985W155
    Extended format: CCYY-Www-D
        Example: 1985-W15-5

Both the summary and the formal definition are intuitively clear, but it
is not obvious how to translate it into an algorithm.  However, we can
deal with the problem by exhaustively enumerating the seven options for
the day of the week on which 1st January falls (with actual year values
for concreteness):

    1st January 2001 is Monday    => Week 1 starts on 2001-01-01
    1st January 2002 is Tuesday   => Week 1 starts on 2001-12-31
    1st January 2003 is Wednesday => Week 1 starts on 2002-12-30
    1st January 2004 is Thursday  => Week 1 starts on 2003-12-29
    1st January 2010 is Friday    => Week 1 starts on 2010-01-04
    1st January 2005 is Saturday  => Week 1 starts on 2005-01-03
    1st January 2006 is Sunday    => Week 1 starts on 2006-01-02

(Cross-check: 1st January 1997 was a Wednesday; the summary notes state
that week 1 of 1997 started on 1996-12-30, which is consistent with the
table derived for dates in the first decade of the third millennium
above).

When working with the Informix DATE types, bear in mind that Informix
uses WEEKDAY values 0 = Sunday, 1 = Monday, 6 = Saturday.  When the
weekday of the first of January has the value in the LH column, you need
to add the value in the RH column to the 1st of January to obtain the
date of the first day of the first week of the year.

    Weekday         Offset to
    1st January     1st day of week 1

    0               +1
    1                0
    2               -1
    3               -2
    4               -3
    5               +3
    6               +2

This can be written as MOD(11-w,7)-3 where w is the (Informix encoding
of the) weekday of 1st January and the value 11 is used to ensure that
no negative values are presented to the MOD operator.  Hence, the
expression for the date corresponding to the 1st day (Monday) of the 1st
week of a given year, yyyy, is:

    d1w1 = MDY(1, 1, yyyy) + MOD(11 - WEEKDAY(MDY(1,1,yyyy)), 7) - 3

This expression is encapsulated in stored procedure day_one_week_one:
}

CREATE PROCEDURE day_one_week_one(yyyy INTEGER) RETURNING DATE;
    DEFINE jan1 DATE;
    LET jan1 = MDY(1, 1, yyyy);
    RETURN jan1 + MOD(11 - WEEKDAY(jan1), 7) - 3;
END PROCEDURE;

{
Given this date d1w1, we can calculate the week number of any other date
in the same year as:

    TRUNC((dateval - d1w1) / 7) + 1

The residual issues are ensuring that the wraparounds are correct.  If
the given date is earlier than the start of the first week of the year
that contains it, then the date belongs to the last week of the previous
year.  If the given date is on or after the start of the first week of
the next year, then the date belongs to the first week of the next year.

Given these observations, we can write iso8601_weeknum as shown below.
(Beware: iso8601_week_number() is too long for servers with the
18-character limit; so is day_one_of_week_one()).

Then comes the interesting testing phase -- when do you get week 53?
One answer is on Friday 1st January 2010, which is in 2009-W53 (as,
indeed, is Sunday 3rd January 2010).  Similarly, Saturday 1st January
2005 is in 2004-W53, but Sunday 1st January 2006 is in 2005-W52.
}

CREATE PROCEDURE iso8601_weeknum(dateval DATE DEFAULT TODAY) RETURNING CHAR(8);
    DEFINE rv CHAR(8);
    DEFINE yyyy CHAR(4);
    DEFINE ww CHAR(2);
    DEFINE d1w1 DATE;
    DEFINE tv DATE;
    DEFINE wn INTEGER;
    DEFINE yn INTEGER;
    -- Calculate year and week number.
    LET yn = YEAR(dateval);
    LET d1w1 = day_one_week_one(yn);
    IF dateval < d1w1 THEN
        -- Date is in early January and is in last week of prior year
        LET yn = yn - 1;
        LET d1w1 = day_one_week_one(yn);
    ELSE
        LET tv = day_one_week_one(yn + 1);
        IF dateval >= tv THEN
            -- Date is in late December and is in the first week of next year
            LET yn = yn + 1;
            LET d1w1 = tv;
        END IF;
    END IF;
    LET wn = TRUNC((dateval - d1w1) / 7) + 1;
    -- Calculation complete: yn is year number and wn is week number.
    -- Format result.
    LET yyyy = yn;
    IF wn < 10 THEN
        LET ww = '0' || wn;
    ELSE
        LET ww = wn;
    END IF
    LET rv = yyyy || '-W' || ww;
    RETURN rv;
END PROCEDURE;

Der Vollständigkeit halber ist die Umkehrfunktion auch mit der Funktion day_one_week_one() oben leicht zu beschreiben:

-- @(#)$Id: ywd_date.spl,v 1.1 2012/12/29 05:13:27 jleffler Exp $
-- @(#)Create ywd_date() and ywdstr_date() stored procedures

-- Convert a date in format year, week, day (ISO 8601) to DATE.
-- Two variants:
-- ywd_date(yyyy SMALLINT, ww SMALLINT, dd SMALLINT) RETURNING DATE;
-- ywdstr_date(ywd CHAR(10)) RETURNING DATE;

-- NB: If week 53 is supplied, there is no check that the year had week
--     53 (GIGO).
-- NB: If year yyyy is a leap year and yyyy-01-01 falls on Wed (3) or
--     Thu (4), there are 53 weeks in the year.
-- NB: If year yyyy is not a leap year and yyyy-01-01 falls on Thu (4),
--     there are 53 weeks in the year.

CREATE PROCEDURE ywd_date(yyyy SMALLINT, ww SMALLINT, dd SMALLINT) RETURNING DATE AS date;
    DEFINE d DATE;
    -- Check ranges
    IF yyyy < 1 OR yyyy > 9999 OR ww < 1 OR ww > 53 OR dd < 1 OR dd > 7 THEN
        RETURN NULL;
    END IF;
    LET d = day_one_week_one(yyyy);
    LET d = d + (ww - 1) * 7 + (dd - 1);
    RETURN d;
END PROCEDURE;

-- Input: 2012-W52-5
CREATE PROCEDURE ywdstr_date(ywd CHAR(10)) RETURNING DATE AS date;
    DEFINE yyyy SMALLINT;
    DEFINE ww   SMALLINT;
    DEFINE dd   SMALLINT;
    LET yyyy = SUBSTR(ywd,  1, 4);
    LET ww   = SUBSTR(ywd,  7, 2);
    LET dd   = SUBSTR(ywd, 10, 1);
    RETURN ywd_date(yyyy, ww, dd);
END PROCEDURE;

CREATE TEMP TABLE test_dates(d DATE);
INSERT INTO test_dates VALUES('2011-12-28');
INSERT INTO test_dates VALUES('2011-12-29');
INSERT INTO test_dates VALUES('2011-12-30');
INSERT INTO test_dates VALUES('2011-12-31');
INSERT INTO test_dates VALUES('2012-01-01');
INSERT INTO test_dates VALUES('2012-01-02');
INSERT INTO test_dates VALUES('2012-01-03');
INSERT INTO test_dates VALUES('2012-01-04');
INSERT INTO test_dates VALUES('2012-01-05');
INSERT INTO test_dates VALUES('2012-01-06');
INSERT INTO test_dates VALUES('2012-01-07');

SELECT d, iso8601_weeknum(d), iso8601_weekday(d), ywdstr_date(iso8601_weekday(d))
  FROM test_dates
 ORDER BY d;

Wie in den Kommentaren erwähnt, akzeptiert der Code ein Datum der Woche 53, auch wenn das Jahr nur 52 Wochen akzeptiert.

27

Ich empfehle dringend, die Zeitfunktionen der C-Standardbibliothek zu verwenden, um die Wochennummer zu berechnen. Insbesondere hat die Funktion strftime Angaben zum Ausdrucken der Wochennummer (neben vielen anderen Werten), die ein Datum in einem aufgeschlüsselten Format (struct tm) enthalten. Hier ist ein kleines Beispielprogramm, das dies veranschaulicht:

#include <stdio.h>
#include <string.h>
#include <time.h>

int
main(void)
{
  struct tm tm;
  char timebuf[64];

  // Zero out struct tm
  memset(&tm, 0, sizeof tm);

  // November 4, 2008 11:00 pm
  tm.tm_sec = 0;
  tm.tm_min = 0;
  tm.tm_hour = 23;
  tm.tm_mday = 4;
  tm.tm_mon = 10;
  tm.tm_year = 108;
  tm.tm_isdst = -1;

  // Call mktime to recompute tm.tm_wday and tm.tm_yday
  mktime(&tm);

  if (strftime(timebuf, sizeof timebuf, "%W", &tm) != 0) {
    printf("Week number is: %s\n", timebuf);
  }

  return 0;
}

Die Ausgabe dieses Programms (kompiliert mit GCC unter Linux und Microsoft Visual Studio 2005 SP1 unter Windows) lautet:

Week number is: 44

Sie können mehr über strftime hier erfahren.

7
Emerick Rogul

Sorry, ich bin neu hier und kann die Antwort selbst nicht kommentieren, aber der Pseudocode aus der Antwort mit dem Häkchen ist nicht richtig.

Pseudocode:

int julian = getDayOfYear(myDate)  // Jan 1 = 1, Jan 2 = 2, etc...
int dow = getDayOfWeek(myDate)     // Sun = 0, Mon = 1, etc...
int dowJan1 = getDayOfWeek("1/1/" + thisYear)   // find out first of year's day
int weekNum = (julian / 7) + 1     // Get our week#
if (dow < dowJan1)                 // adjust for being after Saturday of week #1
    ++weekNum;
return (weekNum)

sie sollten nicht nach dem "ersten Tag des Jahres" suchen, sondern nach dem letzten Tag des letzten Jahres. 

getDayOfWeek("12/31/" + thisYear-1)

wäre richtig statt 

getDayOfWeek("1/1/" + thisYear) 

Wenn Sie dies nicht tun, wäre der letzte Wochentag des letzten Jahres (wie Montag) immer eine Woche voraus.

2
Pascalo

Um in beide Richtungen zu konvertieren, siehe hier: Wikipedia-Artikel zu ISO-Wochendaten

2
Robert L

struct tm wird zur Darstellung der "Ausfallzeit" verwendet und enthält mindestens folgende Felder:

 int tm_sec Sekunden [0,60]. 
 int tm_min Minuten [0,59]. 
 int tm_hour Hour [0,23]. 
 int tm_mday Tag des Monats [1,31]. 
 int tm_mon Monat des Jahres [0,11]. 
 int tm_year Jahre seit 1900. 
 int tm_wday Wochentag [0,6] (Sonntag = 0). 
 int tm_yday Tag des Jahres [0,365]. 
 int tm_isdst Sommerzeitflagge. 

Mit der Funktion localtime () können Sie aus einem time_t ein struct tm erstellen.

Sie können mit der Funktion mktime () aus einem struct tm ein time_t erstellen.

Der beste Teil von struct tm ist, dass Sie Dinge wie das Hinzufügen von 24 zum Mitglied des Monats des Jahres hinzufügen können, und wenn Sie mktime () aufrufen, erhalten Sie eine time_t, die 2 Jahre in der Zukunft liegt (dies funktioniert bei jedem Mitglied, also Sie können beispielsweise die Stunde um 1000 erhöhen und erhalten dann eine Zeit von 41 Tagen in der Zukunft.

2
dicroce

Mit iso_week.h aus howardhinnant.github.io/iso_week.html ist dies leicht erreichbar:

#include <iostream>
#include "iso_week.h"

int main() {
    using namespace iso_week;
    using namespace std::chrono;
    // Get the current time_point and floor to convert to the sys_days:
    auto today = floor<days>(system_clock::now());
    // Convert from sys_days to iso_week::year_weeknum_weekday format
    auto yww = year_weeknum_weekday{today};
    // Print current week number of the year
    std::cout << "The current week of " << yww.year() << " is: " 
              << yww.weeknum() << std::endl;

    // Set any day
    auto any_day = 2014_y/9/28;
    // Get week of `any_day`
    std::cout << "The week of " << any_day.year() << " on `any day` was: " 
              << any_day.weeknum() << std::endl;   
}

und die Ausgabe ist:

The current week of 2019 is: W18
The week in 2014 on `any day` was: W09
1
Remis

Meine Definition ist nicht ISO 8601 (gut genug für meine Zwecke und schnell)

// week number of the year
// (Monday as the first day of the week) as a decimal number [00,53].
// All days in a new year preceding the first Monday are considered to be in week 0.
int GetWeek(const struct tm& ts)
{
    return (ts.tm_yday + 7 - (ts.tm_wday ? (ts.tm_wday - 1) : 6)) / 7;
}
1
Marius

Ich gehe davon aus, dass die erste Woche im Jahr bis zu 7 Tage enthalten kann, wie in Olie's Antwort verdeutlicht .. Der Code behandelt nicht die Kulturen, in denen die Woche an einem anderen Tag als Sonntag beginnt, und das ist ein großer Teil der Welt .

tm t = ... //the date on which to find week of year

int wy = -1;

struct tm t1;
t1.tm_year = t.tm_year;
t1.tm_mday = t1.tm_mon = 1; //set to 1st of January
time_t tt = mktime(&t1); //compute tm

//remove days for 1st week
int yd = t.tm_yday - (7 - t1.tm_wday);
if(yd <= 0 ) //first week is now negative
  wy = 0;
else
  wy = (int)std::ceil( (double) ( yd/7) ); //second week will be 1 
0
pasx

Dies ist meine Lösung, aber nicht in C++

NoOfDays = (CurrentDate - YearStartDate)+1
IF NoOfDays MOD 7 = 0 Then
    WeekNo = INT(NoOfDays/7)
ELSE
    WeekNo = INT(NoOfDays/7)+1
END 
0
Arun Rao
public int GetWeekOfYear(DateTime todayDate)
{
    int days = todayDate.DayOfYear;
    float result = days / 7;
    result=result+1;
    Response.Write(result.ToString());
    return Convert.ToInt32(result);
}

Übergeben Sie einfach das aktuelle Datum als Parameter an diese Funktion . Dann erhalten Sie die aktuelle Wochennummer . Hoffe, es löst Ihr Problem. Anregungen sind sehr willkommen.

0
raghu
time_t t = time(NULL);
tm* timePtr = localtime(&t);
double day_of_year=timePtr->tm_yday +1 ; // 1-365
int week_of_year =(int) ceill(day_of_year/7.0);
0
MINH_NV

Boost bietet gregorian :: date :: week_number () See http://www.boost.org/doc/libs/1_38_0/doc/html/boost/gregorian/date.html und http://www.boost.org/doc/libs/1_38_0/boost/date_time/gregorian/greg_date.hpp .

Ich kann jedoch keine Möglichkeit finden, die Jahreszahl zu erhalten, die der Wochennummer entspricht (die sich möglicherweise von dem Kalenderjahr für dieses Datum unterscheidet).

0
danio

Verwenden Sie gmtime oder localtime, um die Tage seit Sonntag (dh den Wochentag) und die Tage seit dem 1. Januar zu berechnen (beachten Sie, dass der 1. Januar im letzteren "0" ist).

Das willkürliche Bit entscheidet, an welchem ​​Tag des Jahres die Woche 1 beginnt: In der Regel kommt es nur darauf an, welcher Tag der Woche der 1. Januar war, was Sie natürlich aus den beiden Informationen aus gmtime berechnen können. Verwenden Sie dann eine Tabellensuche für die 7 Möglichkeiten. Dies ist wahrscheinlich einfacher als das Kodieren der Regeln.

Ich denke zum Beispiel, dass Outlook den Standard verwendet, dass Woche 1 die erste Woche ist, die einen Donnerstag enthält. Wenn der 1. Januar ein Sonntag ist, ist der erste Tag der Woche 1 der 1. Januar oder der Tag 0. Die verbleibenden Möglichkeiten sind Montag, -1; Dienstag, -2; Mittwoch -3; Donnerstag -4; Freitag, 2; Samstag, 1.

Beachten Sie die negativen Zahlen: "Sonntag der Woche 1" existiert in 4 von 7 Fällen nicht wirklich, aber wenn wir so tun, als wäre es im vergangenen Jahr ein Tag gewesen, bekommen wir die richtige Antwort.

Sobald Sie das haben, gibt Ihnen die Anzahl der Tage zwischen dem Datum und Ihrem Datum die Wochennummer an: Teilen Sie die Zahl durch 7 und addieren Sie 1.

Ich kann mir jedoch vorstellen, dass es irgendwo eine Windows-API gibt, die Ihnen die gleiche Wochennummer gibt, die Outlook verwendet. Ich weiß einfach nicht, was es ist, und wenn sich Ihre Regeln der Woche 1 von den Outlook-Regeln unterscheiden, ist es wahrscheinlich nicht sehr nützlich.

Nicht getesteter Code:

int firstdays[7] = { 0, -1, -2, -3, -4, 2, 1 }; // or some other Week 1 rule
struct tm breakdown;
time_t target = time_you_care_about();
_gmtime_s(&breakdown,&target);
int dayofweek = breakdown.tm_wday;
int dayofyear = breakdown.tm_yday;

int jan1wday = (dayofweek - dayofyear) % 7;
if (jan1wday < 0) jan1wday += 7;

int week1first = firstdays[jan1wday];
if (dayofyear < week1first) return 0;
return ((dayofyear - week1first)/7) + 1;

Sowas sowieso.

0
Steve Jessop