您可以使用内置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"
问题是您必须提前知道用户发送日期的格式。他们不能开始混合和匹配日期格式(无论如何也不应该如此)。
编辑(由 MarkJ 编写)——只是为了证明 Mike 的代码可以将字符串转换为日期。迈克,如果您愿意,请回滚或更改此编辑。
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