I've looked for ways to do this for the longest time and I must say I was surprised that no one had a good way. All of the solutions I found were extremely complicated and didn't work all of the time.
Basically, my problem was that I had some date string that was formatted in a specific way (yyyymmddHHMMSS.mmmmmm) and I needed to be able to work with that date. I needed to convert that to a valid date variable type so I could do some date math (it was just a string data type). That would be easy but I need it to work internationally so I can't just parse the string and do a:
strDate = mm & "-" & dd & "-" & yyyy
If I do that on a system that has its regional settings set to something that expects dd-mm-yyyy I will be working with the wrong date, right? I've had this idea in my head for a while but just hadn't gotten around to testing it. It seems to work great though so I figured I would share it.
Basically, I am just converting a specific date that uses the WORD for the month to a string. Then, I just do some string processing to figure out whether the first 2 characters are for the month or for the day.
Obviously, first I have to get each individual part out:
Dim yyyy As String : yyyy = WMITime.Substring(0, 4)
Dim mm As String : mm = Mid(WMITime, 5, 2) 'Month
Dim dd As String : dd = Mid(WMITime, 7, 2) 'Day
Dim hh As String : hh = Mid(WMITime, 9, 2) 'hour
Dim mn As String : mn = Mid(WMITime, 11, 2) 'minutes
Dim ss As String : ss = Mid(WMITime, 13, 2) 'seconds
Here's the good stuff!
Try
Dim dtmTestDate As Date : dtmTestDate = CDate("January 5, 2000")
Dim strTestDate As String : strTestDate = dtmTestDate.ToShortDateString
WriteLogEntry(vbTab & "Testdate: " & strTestDate, 1)
Select Case True
Case strTestDate.Substring(0, 2) = "05" Or strTestDate.Substring(0, 1) = "5" ' Non-US
strDateFormat = "NonUS"
Case strTestDate.Substring(0, 2) = "01" Or strTestDate.Substring(0, 1) = "1" ' US
strDateFormat = "US"
Case Else
strDateFormat = "UNKNOWN"
End Select
Catch ex As Exception
Call ErrorHandler("ERROR: Cannot determine date format settings", Err, ex)
End Try
I needed to work with the dates multiple times in a loop of code somewhere else. That's why I didn't just set my dates once in the code above. I just figured out what the date format was so I could do what I needed with it in my loop.
Select Case strDateFormat
Case "US"
strDate = mm & "-" & dd & "-" & yyyy
Case "NonUS"
strDate = dd & "-" & mm & "-" & yyyy
Case Else
End Select
Then, I combine that with the time (the format doesn't change for this if you have different regional settings--at least as far as I know)
Dim strTime As String = hh & ":" & mn & ":" & ss
CDate(strDate & " " & strTime)
Ta-da! I can now get the correct date regardless of the regional settings that it is running on. This means I don't have to maintain two separate versions depending on where the software will be used.