日期:2022年04月28日
作者:Commas
注释:内置的Format
、Format$
虽然好用,但是有时候处理那些花里胡哨的日期或日期字符串就有点力不从心,所以就用想法用正则去实现一个方法,并且也兼容系统的正则对象文件损坏的情况,格式化日期字符串。
Option Explicit
Private Sub Form_Load()
On Error Resume Next
Dim vDate As Variant
Debug.Print 1
vDate = "2022/04/28"
Debug.Print vDate, "→", Format(vDate, "YYYY-MM-DD")
Debug.Print vDate, "→", Format$(vDate, "YYYY-MM-DD")
Debug.Print 2
vDate = "2022-04-28 星期四"
Debug.Print vDate, "→", Format(vDate, "YYYY-MM-DD")
Debug.Print vDate, "→", Format$(vDate, "YYYY-MM-DD")
Debug.Print 3
vDate = "星期四 2022-04-28"
Debug.Print vDate, "→", Format(vDate, "YYYY-MM-DD")
Debug.Print vDate, "→", Format$(vDate, "YYYY-MM-DD")
End Sub
运行结果:
1
2022/04/28 → 2022-04-28
2022/04/28 → 2022-04-28
2
2022-04-28 星期四 → 2022-04-28 星期四
2022-04-28 星期四 → 2022-04-28 星期四
3
星期四 2022-04-28 → 星期四 2022-04-28
星期四 2022-04-28 → 星期四 2022-04-28
4
2023-02-19 1:40:45 → 2023-02-19
2023-02-19 1:40:45 → 2023-02-19
结论:不难发现,日期字符串虽然有些可以格式化,但是对于那些花里胡哨的日期字符串却束手无策。不过值得注意的是,对日期格式的数据,却可以正确处理,得到我们的预期值;
既然花里胡哨的非字符串的日期数据
可以正确的格式化,那么是不是意味着我们只要将日期字符串先转换日期数据,再格式化就可以?
日期字符串→日期→Format或Format$日期格式化
Option Explicit
Private Sub Form_Load()
On Error Resume Next
Dim vDate As Variant
Debug.Print 1
vDate = "2022/04/28"
vDate = CDate(vDate)
Debug.Print vDate, "→", Format(vDate, "YYYY-MM-DD")
Debug.Print vDate, "→", Format$(vDate, "YYYY-MM-DD")
Debug.Print 2
vDate = "2022-04-28 星期四"
vDate = CDate(vDate)
Debug.Print vDate, "→", Format(vDate, "YYYY-MM-DD")
Debug.Print vDate, "→", Format$(vDate, "YYYY-MM-DD")
Debug.Print 3
vDate = "星期四 2022-04-28"
vDate = CDate(vDate)
Debug.Print vDate, "→", Format(vDate, "YYYY-MM-DD")
Debug.Print vDate, "→", Format$(vDate, "YYYY-MM-DD")
Debug.Print 4
vDate = Now
Debug.Print vDate, "→", Format(vDate, "YYYY-MM-DD")
Debug.Print vDate, "→", Format$(vDate, "YYYY-MM-DD")
End Sub
运行结果:
结论:日期字符串无法正确被转换为日期,至此,这条路也是行不通的,看来得另寻他法了……
思路:正则是一个好东西,那么用
正则+Format/Format$
实现看看
考虑到有些用户电脑正则相关的文件损坏,无法使用正则,所以先封装获取正则对象的方法,如下:
Public Function GetRegExpObj() As Object
On Error Resume Next
'函数说明:获取一个正则表达式对象
'创建作者:Commas
'创建时间:2022-04-28
'修改时间:
Set GetRegExpObj = CreateObject("vbscript.regexp")
If Err <> 0 Then
Call MsgBox(Err.Description)
Err.Clear
Set GetRegExpObj = Nothing
End If
End Function
再实现日期格式化方法。如果可以获取到正则对象,那么就用正则实现,否则就用“遍历+IsDate(vDate)试错”进行简单尝试,如下:
Public Function FmtDateStr(ByVal vDate As Variant, Optional sFormat As String = "YYYY-MM-DD") As String
On Error Resume Next
'函数说明:将日期或日期字符串格式化输出日期字符串,默认输出格式为“YYYY-MM-DD”,如“2022-04-28”
'创建作者:Commas
'创建时间:2022-04-28
'修改时间:
'------数据格式说明------
'vDate:需要格式化的日期或作日期字符串,如“星期四 2022.04.28 12:15:59”、“2022_04_28 12:15:59 星期四”
'sFormat:预期的日期字符串格式,默认为“YYYY-MM-DD”
'------数据格式说明------
If TypeName(vDate) = "Date" Then
FmtDateStr = Format$(vDate, sFormat)
Else
Dim re As Object
Set re = GetRegExpObj()
If re Is Nothing Then
'用于兼容电脑正则对象受损的处理过程,简单处理,适用于“日期 星期几”或“星期几 日期”的格式
Dim aryDate() As String, aryTemp() As String, i As Long, j As Long
aryDate = Split(vDate, " ")
aryTemp = Split("\@.@_@:", "@")
For i = 0 To UBound(aryDate)
vDate = aryDate(i)
For j = 0 To UBound(aryTemp)
vDate = Replace(vDate, aryTemp(j), "-")
Next j
If IsDate(vDate) Then
Exit For
End If
Next i
If Not IsDate(vDate) Then
FmtDateStr = ""
Exit Function
End If
Else
re.Global = True
re.IgnoreCase = False '设置是否匹配大小写
re.Pattern = "(\d{4}\D\d{1,2}\D\d{1,2})"
Dim clnM As Object
Set clnM = re.Execute(vDate)
vDate = clnM.Item(0).Value
re.Pattern = "\D"
vDate = re.Replace(vDate, "-")
End If
FmtDateStr = Format$(CDate(vDate), sFormat)
End If
End Function
接着我们来看看实现的效果吧,如下:
Option Explicit
Private Sub Form_Load()
Debug.Print "0"
Debug.Print FmtDateStr("2022\04\28 星期三")
Debug.Print FmtDateStr("星期三 2022\04\28")
Debug.Print "1"
Debug.Print FmtDateStr("2022/04/28 星期三")
Debug.Print FmtDateStr("星期三 2022/04/28")
Debug.Print "2"
Debug.Print FmtDateStr("2022-04-28 星期三")
Debug.Print FmtDateStr("星期三 2022-04-28")
Debug.Print "3"
Debug.Print FmtDateStr("2022.04.28 星期三")
Debug.Print FmtDateStr("星期三 2022.04.28")
Debug.Print "4"
Debug.Print FmtDateStr("2022_04_28 星期三")
Debug.Print FmtDateStr("星期三 2022_04_28")
Debug.Print "5"
Debug.Print FmtDateStr("2022/4/28 星期三")
Debug.Print FmtDateStr("星期三 2022/4/28")
Debug.Print "6"
Debug.Print FmtDateStr("2022-4-28 星期三")
Debug.Print FmtDateStr("星期三 2022-4-28")
Debug.Print "7"
Debug.Print FmtDateStr("2022.4.28 星期三")
Debug.Print FmtDateStr("星期三 2022.4.28")
Debug.Print "8"
Debug.Print FmtDateStr("2022_4_28 星期三")
Debug.Print FmtDateStr("星期三 2022_4_28")
Debug.Print "9"
Debug.Print FmtDateStr("星期四 2022-04-28 12:15:59")
Debug.Print FmtDateStr(Now)
End Sub
运行结果:
0
2022-04-28
2022-04-28
1
2022-04-28
2022-04-28
2
2022-04-28
2022-04-28
3
2022-04-28
2022-04-28
4
2022-04-28
2022-04-28
5
2022-04-28
2022-04-28
6
2022-04-28
2022-04-28
7
2022-04-28
2022-04-28
8
2022-04-28
2022-04-28
9
2022-04-28
2022-04-28
无论是正则,还是非正则处理,都能顺利完成预期结果的工作,本次分享就到这里啦,还望各位看官点赞支持一下,谢谢^ - ^
知识加油站
:VB6正则不太会的,可以看我另外一篇文章,补补课——《VB6使用正则浅谈》
版权声明:本文为博主原创文章,如需转载,请给出:
原文链接:https://blog.csdn.net/qq_35844043/article/details/124471246