Jag kanske fått hjärnblödning men råkade iaf på en sak idag som jag tror är lurig. vad är alltså sambandet mellan startvecka och indatum? startvecka är vilken vecka som intervallet börjar på borde inte vara så svårt, men har inte reglerna när veckan börjar i huvudet, så där stannade det, resten torde vara rätt enkelt.. får fortsätta en annan gång <code> Bidrar med ett par VB lösningar (mer eller mindre bra)Veckans nöt #7... aka "gör min hemläxa"
skriv en rutin i valfritt språk som räknar fram första bästa dag i intervallet utifrån ett datum
input:
VeckoIntervall - heltal (intervall i veckor)
StartVecka - heltal (veckonr från när intervallet börjar)
VeckoDagNr - heltal (dag nummer , 1-7 för mån till sön)
InDatum - datum
output:
UtDatum -datum
tex:
startvecka = 2
veckointervall = 4
veckodagnr = 3 (onsdag)
indatum = '2004-11-16'
utdatum = '2004-12-08' (<-om jag inte räknar helt fel själv här :P)
alltså , utdatum ska vara första dagen i det givna intervallet som inträffar efter indatumet.
självklart ska utdatum bli samma oavsett vilket datum vi matar in som är innan 2004-12-08
//RogerSv: Veckans nöt #7... aka "gör min hemläxa"
Sv: Veckans nöt #7... aka "gör min hemläxa"
tex start vecka 2 och intervalllängd 4 veckor
dvs de veckor som matchar är då:
2 6 10 14 18 22 ..... 42 46 50
säg att det är vecka 43 nu (vilket vi kan få fram från indatum)
så är nästa första intervall vecka "46"
och då ska vi ta reda på vilket datum tex onsdag vecka 46 är..
//RogerSv: Veckans nöt #7... aka "gör min hemläxa"
Sv: Veckans nöt #7... aka "gör min hemläxa"
using namespace boost::gregorian;
date nut7(const date& InDatum, int VeckoIntervall, int StartVecka, int VeckoDagNr) {
// nextday är lika med första VeckoDagNr efter indatum
date nextDay = first_day_of_the_week_after(VeckoDagNr % 7).get_date(InDatum);
// nextWeekNo = antal veckor till nästa giltiga vecka
int nextWeekNo = (nextDay.week_number() + VeckoIntervall - StartVecka - 1) / VeckoIntervall * VeckoIntervall + StartVecka - nextDay.week_number();
// Kolla årsskifte
if (nextDay.year() != (nextDay + 7*nextWeekNo).year()) {
// Nytt år: flytta nextDay till första VeckodagNr i vecka 1 nästa år
// Vecka 1 är första veckan med en torsdag
nextDay = first_day_of_the_week_after(Thursday).get_date(date(InDatum.year(), Dec, 31)) - 4 + VeckoDagNr; // ingen % 7 här eftersom söndag innebär en vecka framåt
nextWeekNo = StartVecka - 1;
}
return nextDay + 7 * nextWeekNo;
}
</code>Sv: Veckans nöt #7... aka "gör min hemläxa"
<code>
Function getDate(ByVal InDate As Date, ByVal StartWeek As Integer, ByVal WeekIntervall As Integer, ByVal WeekDayNo As Integer) As Date
Dim lngStartDate As Long
Dim lngTempDate As Long
Dim lngIntervall As Long
Dim lngInDate As Long
Dim lngPeriod As Long
Dim dtDate As Date
Dim lngWeek As Long
Dim lngEndDate As Long
dtDate = DateAdd("d", WeekDayNo - WeekDay(InDate, vbMonday), InDate)
lngWeek = Format(dtDate, "ww", vbMonday, vbFirstFourDays)
lngTempDate = CLng(dtDate)
lngInDate = CLng(InDate)
lngStartDate = lngTempDate - ((lngWeek - StartWeek) * 7)
lngIntervall = WeekIntervall * 7
lngPeriod = (lngTempDate - lngStartDate) / lngIntervall
lngEndDate = lngStartDate + (lngPeriod * lngIntervall)
If lngEndDate < lngInDate Then
lngEndDate = lngEndDate + lngIntervall
End If
getDate = CDate(lngEndDate)
End Function
</code>
<code>
Function getDate2(ByVal InDate As Date, ByVal StartWeek As Integer, ByVal WeekIntervall As Integer, ByVal WeekDayNo As Integer) As Date
Dim StartDate As Date
Dim tmpDate As Date
Dim tempWeek 'As Long
Dim EndDate As Date
tmpDate = DateAdd("d", WeekDayNo - WeekDay(InDate, vbMonday), InDate)
tempWeek = Format(tmpDate, "ww", vbMonday, vbFirstFourDays)
StartDate = DateAdd("ww", StartWeek - tempWeek, tmpDate)
EndDate = DateAdd("ww", WeekIntervall, StartDate)
Do While EndDate < InDate
EndDate = DateAdd("ww", WeekIntervall, EndDate)
Loop
getDate2 = EndDate
End Function
</code>
//
Janne