Sub Process_Globals
Private Prefixes As List = Array As String("ABT", "CAL", "EST", "AFT", "BEF", "BET", "FROM")
Private PrefixesWithInfix As List = Array As String("BET", "FROM")
Private Infixes As List = Array As String("AND", "TO")
Type MyDate (Prefix As String, Day As String, Month As String, Year As String, Text As String)
End Sub
Sub AppStart (Args() As String)
DateTime.DateFormat = "dd MMM yyyy"
ParseText("BET 1 JAN 1852 AND 31 DEC 1852")
ParseText("ABT 3 SEP 1852") ' Note: SEP is not parseable in UK english locale
ParseText("FROM 31 DEC 1852")
ParseText("FROM 1 FEB 2025 AND 30 NOV 2025")
ParseText("BET 1 FEB 2026 TO 30 NOV 2026")
ParseText("FROM 1 FEB 2025 TO 30 NOV 2025")
ParseText("BET 1 FEB 2026 AND 30 NOV 2026")
End Sub
Private Sub ParseText (Text As String)
Dim Date1, Date2 As MyDate
Dim Prefix As String
Dim Infix As String = GetInfix(Text)
If Infix <> "" Then
Dim DateParts() As String = Regex.Split($" ${Infix} "$, Text)
Prefix = GetPrefix(DateParts(0))
' Checking matching prefix to infix with simple if-else
If Prefix = "FROM" And Infix <> "TO" Then
Log("Invalid date! " & Text)
Return
End If
If Prefix = "BET" And Infix <> "AND" Then
Log("Invalid date! " & Text)
Return
End If
DateParts(0) = DateParts(0).SubString(Prefix.Length + 1)
Date1 = ParseDate(Prefix, DateParts(0))
Log($"Date1=(${Date1.Prefix}, ${Date1.Day}, ${Date1.Month}, ${Date1.Year}, ${Date1.Text})"$)
Date2 = ParseDate(Infix, DateParts(1))
Log($"Date2=(${Date2.Prefix}, ${Date2.Day}, ${Date2.Month}, ${Date2.Year}, ${Date2.Text})"$)
Else
Prefix = GetPrefix(Text)
If PrefixesWithInfix.IndexOf(Prefix) > -1 Then
Log("Invalid date! " & Text)
Return
End If
Dim DateParts() As String = Array As String(Text.SubString(Prefix.Length + 1))
Date1 = ParseDate(Prefix, DateParts(0))
If Date1.IsInitialized Then
Log($"Date1=(${Date1.Prefix}, ${Date1.Day}, ${Date1.Month}, ${Date1.Year}, ${Date1.Text})"$)
Else
Log("Invalid date! " & Text)
End If
End If
End Sub
Private Sub GetInfix (Text As String) As String
For Each Infix As String In Infixes
If Text.Contains($" ${Infix} "$) Then
Return Infix
End If
Next
Return ""
End Sub
Private Sub GetPrefix (Text As String) As String
For Each Prefix As String In Prefixes
If Text.StartsWith(Prefix) Then
Return Prefix
End If
Next
Return ""
End Sub
Private Sub ParseDate (Fix As String, DateString As String) As MyDate
Dim TestDate As MyDate
Try
' Fix Sept
DateString = DateString.Replace(" SEP ", " SEPT ")
Dim Ticks As Long = DateTime.DateParse(DateString)
DateString = DateString.Replace(" SEPT ", " SEP ")
Return CreateMyDate(Fix, GetDay(Ticks), GetMonth(Ticks), GetYear(Ticks), DateString)
Catch
Log(LastException)
Return TestDate
End Try
End Sub
Private Sub GetDay (DateTicks As Long) As String
Return DateTime.GetDayOfMonth(DateTicks)
End Sub
Private Sub GetMonth (DateTicks As Long) As String
'Return DateTime.GetMonth(DateTicks)
Return DateUtils.GetMonthName(DateTicks).SubString2(0, 3).ToUpperCase
End Sub
Private Sub GetYear (DateTicks As Long) As String
Return DateTime.GetYear(DateTicks)
End Sub
Public Sub CreateMyDate (Prefix As String, Day As String, Month As String, Year As String, Text As String) As MyDate
Dim t1 As MyDate
t1.Initialize
t1.Prefix = Prefix
t1.Day = Day
t1.Month = Month
t1.Year = Year
t1.Text = Text
Return t1
End Sub