UiPath中使用VB.NET获取排除周末节假日的前一个工作日及代码报错解决
UiPath VB.NET 获取排除周末节假日前一个工作日报错解决方案
报错核心原因
- 代码语法错误:
GetNthDayOfNthWeek函数的参数定义被强制拆分为两行,VB.NET 不允许无换行符的语句断行 - 函数定义不完整:
isHoliday函数未指定返回值类型为Boolean - 缺少命名空间引用:代码用到的
List(Of T)、Any()方法分别依赖System.Collections.Generic、System.Linq命名空间,UiPath 默认未自动导入 - 功能逻辑缺失:原有代码仅实现了节假日判断,未添加排除周末、回溯获取前一个工作日的逻辑
修复步骤
- 打开 UiPath 调用代码(Invoke Code)活动的导入面板,添加以下两个命名空间:
- System.Collections.Generic
- System.Linq
- 将下方修复后的完整代码粘贴到代码输入框,确保没有多余的强制换行
- 如果需要将计算得到的前一个工作日传递给 UiPath 全局变量,可在活动的参数面板新增一个 Out 类型的日期变量,将代码中
preWorkday的值赋值给该变量即可
' 回溯获取前一个有效工作日 Function GetPreviousWorkday(startDate As Date) As Date Dim currentDate As Date = startDate.AddDays(-1) While True ' 先排除周末 If currentDate.DayOfWeek = DayOfWeek.Saturday OrElse currentDate.DayOfWeek = DayOfWeek.Sunday Then currentDate = currentDate.AddDays(-1) Continue While End If ' 再排除节假日 If Not isHoliday(currentDate) Then Return currentDate End If currentDate = currentDate.AddDays(-1) End While End Function ' 判断指定日期是否为节假日 Function isHoliday(ByVal dt As Date) As Boolean Return getHolidayList(dt.Year).Any(Function(x) x = dt) End Function ' 生成指定年份的节假日列表(当前为美国联邦节假日规则,可按需替换为对应地区规则) Public Function getHolidayList(ByVal vYear As Integer) As List(Of Date) Dim FirstWeek As Integer = 1 Dim SecondWeek As Integer = 2 Dim ThirdWeek As Integer = 3 Dim FourthWeek As Integer = 4 Dim LastWeek As Integer = 5 Dim HolidayList As New List(Of Date) HolidayList.Add(DateSerial(vYear, 1, 1)) ' 新年 HolidayList.Add(GetNthDayOfNthWeek(DateSerial(vYear, 1, 1), DayOfWeek.Monday, ThirdWeek)) ' 马丁路德金纪念日 HolidayList.Add(GetNthDayOfNthWeek(DateSerial(vYear, 2, 1), DayOfWeek.Monday, ThirdWeek)) ' 总统日 HolidayList.Add(GetNthDayOfNthWeek(DateSerial(vYear, 5, 1), DayOfWeek.Monday, LastWeek)) ' 阵亡将士纪念日 HolidayList.Add(DateSerial(vYear, 7, 4)) ' 独立日 HolidayList.Add(GetNthDayOfNthWeek(DateSerial(vYear, 9, 1), DayOfWeek.Monday, FirstWeek)) ' 劳动节 HolidayList.Add(GetNthDayOfNthWeek(DateSerial(vYear, 10, 1), DayOfWeek.Monday, SecondWeek)) ' 哥伦布日 HolidayList.Add(DateSerial(vYear, 11, 11)) ' 退伍军人节 HolidayList.Add(GetNthDayOfNthWeek(DateSerial(vYear, 11, 1), DayOfWeek.Thursday, FourthWeek)) ' 感恩节 HolidayList.Add(DateSerial(vYear, 12, 25)) ' 圣诞节 ' 周末节假日调休逻辑:周六放假提前到周五,周日放假延后到周一 For i As Integer = 0 To HolidayList.Count - 1 Dim dt As Date = HolidayList(i) If dt.DayOfWeek = DayOfWeek.Saturday Then HolidayList(i) = dt.AddDays(-1) End If If dt.DayOfWeek = DayOfWeek.Sunday Then HolidayList(i) = dt.AddDays(1) End If Next Return HolidayList End Function ' 计算指定月份第N周的周X对应的具体日期 Private Function GetNthDayOfNthWeek(ByVal dt As Date, ByVal DayofWeek As Integer, ByVal WhichWeek As Integer) As Date Dim dtFirst As Date = DateSerial(dt.Year, dt.Month, 1) Dim dtRet As Date = dtFirst.AddDays(6 - dtFirst.AddDays(-(DayofWeek + 1)).DayOfWeek) dtRet = dtRet.AddDays((WhichWeek - 1) * 7) If dtRet >= dtFirst.AddMonths(1) Then dtRet = dtRet.AddDays(-7) End If Return dtRet End Function ' 调用示例:获取当前日期的前一个工作日并输出 Dim preWorkday As Date = GetPreviousWorkday(Today) Console.WriteLine("前一个工作日为:" & preWorkday.ToString("yyyy-MM-dd"))
内容的提问来源于stack exchange,提问作者P002143_k
相关产品推荐
相关产品推荐

