+// convert Sun, Mon, ..., Sat into 6, 0, ..., 5
+static inline int ConvertWeekDayToMondayBase(int wd)
+{
+ return wd == wxDateTime::Sun ? 6 : wd - 1;
+}
+
+/* static */
+wxDateTime
+wxDateTime::SetToWeekOfYear(int year, wxDateTime_t numWeek, WeekDay wd)
+{
+ wxASSERT_MSG( numWeek > 0,
+ _T("invalid week number: weeks are counted from 1") );
+
+ // Jan 4 always lies in the 1st week of the year
+ wxDateTime dt(4, Jan, year);
+ dt.SetToWeekDayInSameWeek(wd);
+ dt += wxDateSpan::Weeks(numWeek - 1);
+
+ return dt;
+}
+
+// use a separate function to avoid warnings about using deprecated
+// SetToTheWeek in GetWeek below
+static wxDateTime
+SetToTheWeek(int year,
+ wxDateTime::wxDateTime_t numWeek,
+ wxDateTime::WeekDay weekday,
+ wxDateTime::WeekFlags flags)
+{
+ // Jan 4 always lies in the 1st week of the year
+ wxDateTime dt(4, wxDateTime::Jan, year);
+ dt.SetToWeekDayInSameWeek(weekday, flags);
+ dt += wxDateSpan::Weeks(numWeek - 1);
+
+ return dt;
+}
+
+bool wxDateTime::SetToTheWeek(wxDateTime_t numWeek,
+ WeekDay weekday,
+ WeekFlags flags)
+{
+ int year = GetYear();
+ *this = ::SetToTheWeek(year, numWeek, weekday, flags);
+ if ( GetYear() != year )
+ {
+ // oops... numWeek was too big
+ return false;
+ }
+
+ return true;
+}
+
+wxDateTime wxDateTime::GetWeek(wxDateTime_t numWeek,
+ WeekDay weekday,
+ WeekFlags flags) const
+{
+ return ::SetToTheWeek(GetYear(), numWeek, weekday, flags);
+}
+