VB.Net获取格式为MM-dd-yyyy的当月最后一天并实现日期对比
解决方案
核心优化点
- 取消字符串拼接获取月末日期的逻辑,直接通过
Date构造函数生成月末日期对象,性能更高且不会出现格式兼容问题 - 直接使用日期对象做大小对比,无需转换为字符串再处理
- 格式化输出直接调用
ToString("MM-dd-yyyy")即可得到要求的格式,全程不需要用到Date Picker控件
完整优化代码
' 获取指定月份的第四个周二 Function FourthTueOfMonth(dt As Date) As Date Dim currDate = New Date(dt.Year, dt.Month, 1) Dim nTuesday = 0 While nTuesday < 4 If currDate.DayOfWeek = DayOfWeek.Tuesday Then nTuesday += 1 End If currDate = currDate.AddDays(1) End While Return New Date(dt.Year, dt.Month, currDate.Day - 1) End Function ' 获取指定月份的最后一天 Function GetMonthLastDay(dt As Date) As Date Return New Date(dt.Year, dt.Month, Date.DaysInMonth(dt.Year, dt.Month)) End Function Private Sub btnFindDate_Click(sender As Object, e As EventArgs) Handles btnFindDate.Click ' 注意:此处tORf需要从DB读取历史存储值,不要每次初始化为False Dim tORf As Boolean = False ' 实际使用时替换为从DB查询的结果 Dim dateToday = Date.Today Dim dateFourthTue = FourthTueOfMonth(dateToday) Dim currentMonthLastDay = GetMonthLastDay(dateToday) ' 控件赋值,按要求输出MM-dd-yyyy格式直接用对应格式化参数即可 tbFourthTue.Text = dateFourthTue.ToString("MM-dd-yyyy") tbEndOFMonth.Text = currentMonthLastDay.ToString("MM-dd-yyyy") ' 业务逻辑1:今日晚于当月第四个周二且布尔值为False,写入True和当月最后一天到DB If Not tORf AndAlso dateToday > dateFourthTue Then MessageBox.Show("今日晚于当月第四个周二") ' 此处执行DB写入逻辑:插入/更新 tORf=True, 存储日期=currentMonthLastDay ' tORf = True ' tbMessage.Text = tORf.ToString() End If ' 业务逻辑2:今日晚于上月最后一天且布尔值为True,写入False和新月最后一天到DB Dim lastMonthLastDay = GetMonthLastDay(dateToday.AddMonths(-1)) If tORf AndAlso dateToday > lastMonthLastDay Then MessageBox.Show("今日晚于上月最后一天,已跨月") Dim newMonthLastDay = GetMonthLastDay(dateToday) ' 此处执行DB写入逻辑:插入/更新 tORf=False, 存储日期=newMonthLastDay ' tORf = False ' tbMessage.Text = tORf.ToString() End If End Sub
关键逻辑说明
- 月末日期直接通过
Date.DaysInMonth获取当月天数后传入Date构造函数生成,完全不需要字符串拼接操作,避免了不同区域格式下的解析错误 - 跨月判断时需要对比上月最后一天而非当月最后一天,原代码的对比逻辑存在问题,已修正
- 所有日期输出直接通过
ToString的格式化参数实现,只要传入"MM-dd-yyyy"即可得到要求的格式
内容的提问来源于stack exchange,提问作者Vector
相关产品推荐
相关产品推荐

