VB6日期或日期字符串的格式化

日期:2022年04月28日
作者:Commas
注释:内置的FormatFormat$虽然好用,但是有时候处理那些花里胡哨的日期或日期字符串就有点力不从心,所以就用想法用正则去实现一个方法,并且也兼容系统的正则对象文件损坏的情况,格式化日期字符串。



一、Format与Format$

1-1)内置格式化函数格式日期 1.0

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/282022-04-28
2022/04/282022-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:452023-02-19
2023-02-19 1:40:452023-02-19

结论:不难发现,日期字符串虽然有些可以格式化,但是对于那些花里胡哨的日期字符串却束手无策。不过值得注意的是,对日期格式的数据,却可以正确处理,得到我们的预期值;

1-2)内置格式化函数格式日期 2.0

既然花里胡哨非字符串的日期数据可以正确的格式化,那么是不是意味着我们只要将日期字符串先转换日期数据,再格式化就可以?

日期字符串→日期→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

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值