You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UiPath中使用VB.NET获取排除周末节假日的前一个工作日及代码报错解决

UiPath VB.NET 获取排除周末节假日前一个工作日报错解决方案

报错核心原因

  • 代码语法错误:GetNthDayOfNthWeek 函数的参数定义被强制拆分为两行,VB.NET 不允许无换行符的语句断行
  • 函数定义不完整:isHoliday 函数未指定返回值类型为 Boolean
  • 缺少命名空间引用:代码用到的 List(Of T)、Any() 方法分别依赖 System.Collections.Generic、System.Linq 命名空间,UiPath 默认未自动导入
  • 功能逻辑缺失:原有代码仅实现了节假日判断,未添加排除周末、回溯获取前一个工作日的逻辑

修复步骤

  1. 打开 UiPath 调用代码(Invoke Code)活动的导入面板,添加以下两个命名空间:
    • System.Collections.Generic
    • System.Linq
  2. 将下方修复后的完整代码粘贴到代码输入框,确保没有多余的强制换行
  3. 如果需要将计算得到的前一个工作日传递给 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 21:36:06