在 VBScript 中根据周数和星期几获取日期






4.67/5 (4投票s)
逐步解释
引言
VBScript 只提供了基本的日历函数 - 所以我们需要做一些工作来增强它。周数有点棘手,因为有 3 种方法来确定一年中的第一周
- 一年中的第一个完整周
- 至少有 4 个工作日的第一个周(ISO 周)
- 包含 1 月 1 日的周
背景
此示例将显示使用 ISO 方法的计算,但我认为将其调整为任何其他方法都很简单。
Using the Code
现在……它是如何完成的:ISO 方法将一年中的第一周定义为包含至少 4 个工作日的第一周 - 换句话说:1 月 4 日始终是第一周。让我们首先获取给定年份的这个日期
datFourthJan = DateSerial(intDesiredYear, 1, 4)
下一步是获取包含 1 月 4 日的周的开始。 也许 1 月 4 日本身是星期一 - 否则我们必须回溯到它。 VBScript 的 Weekday
函数将为一周中的每一天提供一个索引号,具体取决于本地化(国家/地区)。 默认情况下,它从星期日 = 1、星期一 = 2、.....星期六 = 7 开始。 将 0(零)作为第二个参数传递,我们将告诉该函数使用本地化索引 - 在德国,这一周从星期一开始,星期一 = 1,依此类推...
通过从已经计算出的日期中减去 1 月 4 日的日期索引,我们将获得该周的开始日期,例如:如果 1 月 4 日是星期二(索引 = 2)- 要获得星期一,我们必须按如下方式减去
datFirstWeekMonday = datFourthJan - WeekDay(datFourthJan, 0) + 1
不要忘记在最后添加 1,因为星期几索引是基于 1 的,而不是基于零的!
请记住,如果您使用具有不同星期几索引的本地化,或者使用第二个参数来显式指定索引系统,则需要根据您的需要调整此计算!
现在我们找到了该年第一周开始的日期,只需添加天数到我们给定周数的开始日期。 假设我们正在寻找一年的第 10 周,我们必须计算
weeknr = 10
datDesiredWeekStart = DateAdd("d", ((weeknr - 1) * 7), datFirstWeekMonday)
请注意,我们必须从计算中的期望周数中减去 1,因为我们已经从第 1 周开始!
最后要做的是从一周的第一天向前跳到我们要查找的星期几。 再次,我们使用星期几索引来计算两个星期几之间的差异(如果不同)
intDesiredWeekDay = 5 'Friday when using German localization
datDesiredDate = DateAdd("d", (intDesiredWeekDay - 1), datDesiredWeekStart)
同样,我们从所需的星期几索引中减去了 1,因为使用例如德国本地化,星期一等于 1(而不是 0)。 使用不同的本地化/索引需要调整计算!
为了缩短上述步骤,我们可以将它们简化为单行公式
datDesiredDate = DateAdd("d", ((weeknr - 1) * 7) + (intDesiredWeekDay - 1), _
(DateSerial(intDesiredYear,1,4) - WeekDay(DateSerial(intDesiredYear,1,4), 0) + 1))
我们完成了 - 就是这样!