2016-11-08 149 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

相关问题