2016-11-08 104 views
1

考慮:如何獲得給定周的第一天的日期?

weekNumber = 45, 
year = 2016 

的第一個星期的條件:

-Starts週一

-vbFirstFourDays - 開始與具有在新的一年

至少四天的第一週

如何獲得具有給定數據的日期'Monday 07.11.2016' (dd.mm.yyyy)

+0

我有weeknumber與去年..我要得到的日期07.11。 2016 – Bene

+0

'DateAdd(「ww」,weekNumber,DateSerial(year,1,1))'會讓你關閉。 – Lankymart

回答

2

由於接受的答案仍然有錯誤的結果我在這裏做一個比較。

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 

這裏輸出。該功能DateYWkWd可以unsed普遍 提供的一年,週數和星期(1 = Mon..7 =星期日)

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

哦,我沒有仰望2018年..謝謝 – Bene

+1

函數DateYWkWd()回答這個問題。 – Bene

0

所以,你可以通過

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

得到一天,因爲第一週只有4天,其餘44個星期7天。

現在,你可以通過使用DateAdd獲取日期:

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

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

MsgBox NewDate 
+0

謝謝你的回答..明年怎麼樣?如果我在第一週輸入01.01.2017,我會得到第一個星期一而不是星期一.. – Bene

+2

我會使用'NewDate = DateAdd(「d」,nDay,DateSerial(2016,1,1))'來避免本地格式化的問題。 – Lankymart

+0

@Lankymart謝謝,更好!我編輯過。 – duDE

1

這可以用DateAdd()WeekDay()功能的組合來完成,而無需進行手工計算。

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 

輸出:

07/11/2016 

更新:

在5分鐘內,用最少的測試將這個在一起,似乎這樣的伎倆,但@lotpingsanswer proves在某些年份它仍然會失敗。這只是一個快速刺,他們的答案絕對是正確的使用方法。

+1

工作得很好謝謝 – Bene

+1

@Bene + Lankymart,很抱歉,但結果只會在1月1日的週日是週五到週日的幾年內給出正確的結果。這一點和下一年都是如此,但2018年失敗。更好的方法是確定1月4日的工作日,因爲這將是第一週。 – LotPings

相關問題