Вы можете использовать встроенную функцию Format
, чтобы сделать это для вас.
Вот простой тест для подтверждения этого:
Public Sub TestDateParsing()
'On my computer, the date format is U.S. (mm/dd/yyyy)'
'This test creates a date string in dd/mm/yyyy format to'
'simulate user input in a different format'
Const TEST_DATE As Date = #6/1/2009#
Dim inputDate As String
inputDate = Format(TEST_DATE, "dd/mm/yyyy")
'inputDate is "1/6/2009" (June 1 in dd/mm/yyyy format)'
Debug.Print Format(inputDate, "dd/mm/yyyy")
'It`s magic! The above line will print 6/1/2009'
'which is the correct format for my Regional Settings'
End Sub
Это может показаться магией, но это не так. Он использует преимущества функции Format
в сочетании с текущими региональными настройками.
Например, предположим, что ваши региональные настройки настроены на использование формата "mm/dd/yyyy"
для дат.
Теперь вы получаете строку даты от пользователя в формате "dd/mm/yyyy"
. Если вы Format
эту строку даты и скажете Format
также использовать "dd/mm/yyy"
, она поменяет местами часть даты месяца и дня, потому что ваши настройки говорят, что даты в формате "mm/dd/yyyy"
.
Другими словами, Format
всегда предполагает, что строка даты от пользователя отформатирована в соответствии с вашими текущими региональными настройками (в данном случае "mm/dd/yyyy"
), поэтому, когда вы говорите ей форматировать дату с помощью "dd/mm/yyyy"
, это заставит его поменять местами месяц и день. Если ваши региональные настройки используют тот же формат, что и предоставленная пользователем дата, этот код все равно будет работать: Format
просто вернет дату пользователя без изменений. Смущены еще? ;)
То же самое произойдет, если ваши региональные настройки установлены на "dd/mm/yyyy"
, и пользователь отправляет дату в формате "mm/dd/yyyy"
.
Суть в том, что вам нужно заранее знать, в каком формате пользователь отправляет даты. Они не могут начинать смешивать и сопоставлять форматы дат (и они не должны быть в любом случае).
EDIT ( от MarkJ ) - просто чтобы доказать, что код Майка может преобразовать строку в Date. Майк, пожалуйста, откатись или измени эту правку, если хочешь.
Public Sub Test()
Dim dte As Date
For dte = #1/1/2009# To #12/31/2009#
Call TestDateParsing(dte)
Next dte
End Sub
Public Sub TestDateParsing(ByVal dteIn As Date)
'On my computer, the date format is U.S. (mm/dd/yyyy)'
'This test creates a date string in dd/mm/yyyy format to'
'simulate user input in a different format'
Dim sExpected As String
sExpected = Day(dteIn) & " / " & Month(dteIn) & " / " & Year(dteIn)
Dim inputDate As String
Dim dte As Date
inputDate = Format(dteIn, "dd/mm/yyyy")
dte = Format(inputDate, "dd/mm/yyyy")
Debug.Assert sExpected = Day(dte) & " / " & Month(dte) & " / " & Year(dte)
Debug.Print sExpected
End Sub