vb.net新年第4个星期二
vb.net 4th Tuesday when new year
我编写了一个支票簿应用程序,它将每月的第 4 个星期二存储在 SQLite 数据库中,当用户写支票并且今天的日期大于存储的日期时,新的第 4 个星期二日期将在数据库和存入 SS 付款的功能已加载。
在测试时我发现当年份改变时我写的第一个函数会失败。
所以我写了第二个函数来处理年的变化。
该代码似乎正在运行。我想将测试合并到一个函数中,因为代码看起来不够优雅。我将 post 下面的小测试应用程序代码。
这两个函数在一个模块中。
Public Class frmStart
Dim varSearchDate As Date
Dim varFTue As Date
Private Sub frmStart_Load(sender As Object, e As EventArgs) Handles MyBase.Load
tbBox1.Text = "2021-12-28" ' 2021-11-23 2021-12-28 TEST DATES
End Sub
Private Sub btnADD_Click(sender As Object, e As EventArgs) Handles btnADD.Click
varSearchDate = CDate(tbBox1.Text)
tbAns.Text = varSearchDate.ToString("M-d-yyyy")
Dim dateToday = Date.Today
Dim mo As String
mo = varSearchDate.ToString("MM")
If dateToday > varSearchDate And CInt(mo) <> 12 Then
varFTue = CDate(FourthTueOfNextMonth(Date.Today).ToString("yyyy-M-d"))
MsgBox("varFTue Next Mo " & varFTue)
tbBox2.Text = varFTue.ToString("yyyy-M-d")
'WriteNewFourthTue()
'gvTxType = "SS Deposit"
ElseIf dateToday > varSearchDate And CInt(mo) = 12 Then
varFTue = CDate(FourthTueOfNewYear(Date.Today).ToString("yyyy-M-d"))
MsgBox("varFTue New Yr " & varFTue)
tbBox3.Text = varFTue.ToString("yyyy-M-d")
'WriteNewFourthTue()
'gvTxType = "SS Deposit"
End If
End Sub
结束Class
这两个函数和我的测试代码只使用一个函数被注释掉了
Module FunctionModule
'Function FourthTueOfNextMonth(dt As Date) As Date
' Dim currDate = New Date(dt.Year, dt.Month, 1)
' Dim nTuesday As Integer
' While nTuesday < 4
' If currDate.DayOfWeek = DayOfWeek.Tuesday Then
' nTuesday += 1
' End If
' currDate = currDate.AddDays(1)
' End While
' If dt.Month <> 12 Then
' Return New Date(dt.Year, dt.Month, currDate.Day - 1)
' ElseIf dt.Month = 12 Then
' Return New Date(dt.Year + 1, dt.Month - 11, currDate.Day - 1)
' End If
'End Function
Function FourthTueOfNextMonth(dt As Date) As Date
Dim currDate = New Date(dt.Year, dt.Month, 1)
Dim nTuesday As Integer
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 FourthTueOfNewYear(dt As Date) As Date
Dim currDate = New Date(dt.Year + 1, dt.Month - 11, 1)
Dim nTuesday As Integer
While nTuesday < 4
If currDate.DayOfWeek = DayOfWeek.Tuesday Then
nTuesday += 1
End If
currDate = currDate.AddDays(1)
End While
Return New Date(dt.Year + 1, dt.Month - 11, currDate.Day - 1)
End Function
模块结束
我的问题是有没有更好的方法来编写这段代码,所以我只有一个函数?
这是一个根据传入的日期查找下个月的第四个星期二的函数:
Function FourthTueOfNextMonth(dt As Date) As Date
' Start with the First Day of the Month, from the date passed in.
' Add one Month to that to get the first Day of the NEXT month.
Dim currDate As Date = (New Date(dt.Year, dt.Month, 1)).AddMonths(1)
' Find the First Tuesday of the Month
While currDate.DayOfWeek <> DayOfWeek.Tuesday
currDate = currDate.AddDays(1)
End While
' Add three more Weeks to jump to Fourth Tuesday
Return currDate.AddDays(21)
End Function
请注意,该函数总是 returns 下个月的第四个星期二,并且它不会检查传入的日期是否小于包含该日期的同月的第四个星期二已通过。
我编写了一个支票簿应用程序,它将每月的第 4 个星期二存储在 SQLite 数据库中,当用户写支票并且今天的日期大于存储的日期时,新的第 4 个星期二日期将在数据库和存入 SS 付款的功能已加载。
在测试时我发现当年份改变时我写的第一个函数会失败。
所以我写了第二个函数来处理年的变化。
该代码似乎正在运行。我想将测试合并到一个函数中,因为代码看起来不够优雅。我将 post 下面的小测试应用程序代码。
这两个函数在一个模块中。
Public Class frmStart
Dim varSearchDate As Date
Dim varFTue As Date
Private Sub frmStart_Load(sender As Object, e As EventArgs) Handles MyBase.Load
tbBox1.Text = "2021-12-28" ' 2021-11-23 2021-12-28 TEST DATES
End Sub
Private Sub btnADD_Click(sender As Object, e As EventArgs) Handles btnADD.Click
varSearchDate = CDate(tbBox1.Text)
tbAns.Text = varSearchDate.ToString("M-d-yyyy")
Dim dateToday = Date.Today
Dim mo As String
mo = varSearchDate.ToString("MM")
If dateToday > varSearchDate And CInt(mo) <> 12 Then
varFTue = CDate(FourthTueOfNextMonth(Date.Today).ToString("yyyy-M-d"))
MsgBox("varFTue Next Mo " & varFTue)
tbBox2.Text = varFTue.ToString("yyyy-M-d")
'WriteNewFourthTue()
'gvTxType = "SS Deposit"
ElseIf dateToday > varSearchDate And CInt(mo) = 12 Then
varFTue = CDate(FourthTueOfNewYear(Date.Today).ToString("yyyy-M-d"))
MsgBox("varFTue New Yr " & varFTue)
tbBox3.Text = varFTue.ToString("yyyy-M-d")
'WriteNewFourthTue()
'gvTxType = "SS Deposit"
End If
End Sub
结束Class
这两个函数和我的测试代码只使用一个函数被注释掉了
Module FunctionModule
'Function FourthTueOfNextMonth(dt As Date) As Date
' Dim currDate = New Date(dt.Year, dt.Month, 1)
' Dim nTuesday As Integer
' While nTuesday < 4
' If currDate.DayOfWeek = DayOfWeek.Tuesday Then
' nTuesday += 1
' End If
' currDate = currDate.AddDays(1)
' End While
' If dt.Month <> 12 Then
' Return New Date(dt.Year, dt.Month, currDate.Day - 1)
' ElseIf dt.Month = 12 Then
' Return New Date(dt.Year + 1, dt.Month - 11, currDate.Day - 1)
' End If
'End Function
Function FourthTueOfNextMonth(dt As Date) As Date
Dim currDate = New Date(dt.Year, dt.Month, 1)
Dim nTuesday As Integer
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 FourthTueOfNewYear(dt As Date) As Date
Dim currDate = New Date(dt.Year + 1, dt.Month - 11, 1)
Dim nTuesday As Integer
While nTuesday < 4
If currDate.DayOfWeek = DayOfWeek.Tuesday Then
nTuesday += 1
End If
currDate = currDate.AddDays(1)
End While
Return New Date(dt.Year + 1, dt.Month - 11, currDate.Day - 1)
End Function
模块结束
我的问题是有没有更好的方法来编写这段代码,所以我只有一个函数?
这是一个根据传入的日期查找下个月的第四个星期二的函数:
Function FourthTueOfNextMonth(dt As Date) As Date
' Start with the First Day of the Month, from the date passed in.
' Add one Month to that to get the first Day of the NEXT month.
Dim currDate As Date = (New Date(dt.Year, dt.Month, 1)).AddMonths(1)
' Find the First Tuesday of the Month
While currDate.DayOfWeek <> DayOfWeek.Tuesday
currDate = currDate.AddDays(1)
End While
' Add three more Weeks to jump to Fourth Tuesday
Return currDate.AddDays(21)
End Function
请注意,该函数总是 returns 下个月的第四个星期二,并且它不会检查传入的日期是否小于包含该日期的同月的第四个星期二已通过。