2016-11-08 2 views
1

Gegeben:Wie erhalte ich das Datum des ersten Tages einer bestimmten Woche?

weekNumber = 45, 
year = 2016 

Die Bedingungen für die erste Woche:

-Starts mit Montag

-vbFirstFourDays - mit der Woche beginnen, die

mindestens vier Tage im neuen Jahr hat

Wie bekomme ich das Datum 'Monday 07.11.2016' (dd.mm.yyyy) mit den angegebenen Daten?

+0

ich habe die Wochennummer und das Jahr .. ich brauche das Datum 07.11 zu erhalten. 2016 – Bene

+0

'DateAdd (" ww ", weekNumber, DateSerial (year, 1,1))' wird dich nah bringen. – Lankymart

Antwort

2

Da die akzeptierte Antwort immer noch falsche Ergebnisse hat mache ich einen Vergleich hier.

Option Explicit 
Dim year, wn, wd, wk, Jan4, wdn, wno, nDay, Out 

wn = 45 

For year = 2012 to 2018 
    Wscript.Echo "LotPings : " & ShowDate(DateYWkWd(year,wn,1)) 
    Wscript.Echo "Lankymart: " & Showdate(Lankymart(year,wn)) 
    Wscript.Echo "duDE  : " & Showdate( duDE(year,wn)) 
    Wscript.Echo 
Next 

Function DateYWkWd(year, wn, wd) 
    ' returns date based von VbMondeay and vbFirstFourDays 
    Jan4 = Dateserial(year,1,4) ' garantied to be in first week 
    DateYWkWd = DateAdd("ww",wn-1, DateAdd("d",wd-Weekday(Jan4,2),Jan4)) 
end Function 

Function Lankymart(year, wn) 
    wd = DateAdd("ww", wn, DateSerial(year,1,1)) 
    Lankymart = wd - WeekDay(wd, vbMonday) + 1 
end Function 

Function duDE(year, wn) 
    nDay = 4 + (wn - 1)*7 - 1 
    duDE = DateAdd("d", nDay, DateSerial(year,1,1)) 
end Function 

Function ShowDate(date) 
    Wd = Weekday(date,vbMonday) 
    Wdn = WeekDayName(Wd, True,vbMonday) 
    Wno = datepart("ww", date, vbMonday, vbFirstFourDays) 
    Out = Wdn & " " & date & " WeekNo : " & Wno 
    If Wno <> wn Then Out = Out & " **wrong week **" 
    If Wd <> 1 Then Out = Out & " **wrong wkday**" 
    ShowDate = Out 
end Function 

Hier der Ausgang. Die Funktion DateYWkWd unsed werden könnte universell Providing Jahr, Woche und Tag der Woche (1 = Mon..7 = Sonne)

LotPings : Mon 11/5/2012 WeekNo : 45 
Lankymart: Mon 11/5/2012 WeekNo : 45 
duDE  : Wed 11/7/2012 WeekNo : 45 **wrong wkday** 

LotPings : Mon 11/4/2013 WeekNo : 45 
Lankymart: Mon 11/11/2013 WeekNo : 46 **wrong week ** 
duDE  : Fri 11/8/2013 WeekNo : 45 **wrong wkday** 

LotPings : Mon 11/3/2014 WeekNo : 45 
Lankymart: Mon 11/10/2014 WeekNo : 46 **wrong week ** 
duDE  : Sat 11/8/2014 WeekNo : 45 **wrong wkday** 

LotPings : Mon 11/2/2015 WeekNo : 45 
Lankymart: Mon 11/9/2015 WeekNo : 46 **wrong week ** 
duDE  : Sun 11/8/2015 WeekNo : 45 **wrong wkday** 

LotPings : Mon 11/7/2016 WeekNo : 45 
Lankymart: Mon 11/7/2016 WeekNo : 45 
duDE  : Mon 11/7/2016 WeekNo : 45 

LotPings : Mon 11/6/2017 WeekNo : 45 
Lankymart: Mon 11/6/2017 WeekNo : 45 
duDE  : Wed 11/8/2017 WeekNo : 45 **wrong wkday** 

LotPings : Mon 11/5/2018 WeekNo : 45 
Lankymart: Mon 11/12/2018 WeekNo : 46 **wrong week ** 
duDE  : Thu 11/8/2018 WeekNo : 45 **wrong wkday** 
+0

Oh, ich habe 2018 nicht geschaut ..Danke – Bene

+1

Die Funktion DateYWkWd() beantwortet die Frage. – Bene

0

So können Sie den Tag von

4 + (45 - 1)*7 - 1 = 311 

zu bekommen, weil die erste Woche nur 4 Tage hat und die restlichen 44 Wochen haben 7 Tage.

Jetzt können Sie das Datum von DateAdd erhalten:

Dim nDay 
nDay = 4 + (45 - 1)*7 - 1 

Dim NewDate 
NewDate = DateAdd("d", nDay, DateSerial(2016,1,1)) 

MsgBox NewDate 
+0

Vielen Dank für die Antwort .. Wie wäre es nächstes Jahr? Wenn ich Woche 1 mit 01.01.2017 schreibe, bekomme ich den ersten Mittwoch statt Montag. – Bene

+2

Ich würde 'NewDate = DateAdd (" d ", nDay, DateSerial (2016,1,1))' verwenden, um lokale Formatierung zu vermeiden Probleme. – Lankymart

+0

@Lankymart Danke, besser! Ich habe bearbeitet. – duDE

1

Dies kann ohne manuelle Berechnungen durchführen zu müssen mit einer Kombination aus DateAdd() und WeekDay() Funktionen durchgeführt werden.

Dim year: year = 2016 
Dim wn: wn = 45 
Dim wd: wd = DateAdd("ww", wn, DateSerial(year,1,1)) 

WScript.Echo wd - WeekDay(wd, vbMonday) + 1 

Ausgang:

07/11/2016 

Update:

diese zusammen in 5 Minuten und bei minimalem Test schien den Trick, aber als @lotpingsanswer proves in bestimmten Jahren zu tun es wird immer noch fehlschlagen. Es war nur ein kurzer Stich und ihre Antwort ist definitiv der richtige Ansatz zu verwenden.

+1

Funktioniert ganz gut danke – Bene

+1

@Bene + Lankymart, tut mir leid, aber das Ergebnis wird nur korrekte Ergebnisse in Jahren geben, wo der Wochentag des 1. Januar Freitag bis Sonntag ist. Dies gilt für dieses und das nächste Jahr, scheitert aber im Jahr 2018. Ein besserer Weg ist es, den Wochentag des 4. Jan. zu bestimmen, da dies die erste Woche ist. – LotPings

Verwandte Themen