当前位置: 首页 > article >正文

VBA 根据日期字符串 返回日期格式(只能识别部分常用格式)

'主程序入口
Sub MainTest()
    Debug.Print GetDateFormat("20240101")               ' YYYYMMDD
    Debug.Print GetDateFormat("2024-01-01")            ' YYYY-MM-DD
    Debug.Print GetDateFormat("2024/01/01")            ' YYYY/MM/DD
    Debug.Print GetDateFormat("2024-01-01 12:30:45")   ' YYYY-MM-DD HH24:MI:SS
    Debug.Print GetDateFormat("2024/01/01 12:30:45")   ' YYYY/MM/DD HH24:MI:SS
    
    Debug.Print GetDateFormat("2024-01-01 12:30")   ' YYYY-MM-DD HH24:MI
    Debug.Print GetDateFormat("2024/01/01 12:30")   ' YYYY/MM/DD HH24:MI
    
    Debug.Print GetDateFormat("2024-01-01 12")   ' YYYY-MM-DD HH24
    Debug.Print GetDateFormat("2024/01/01 12")   ' YYYY/MM/DD HH24
    
    Debug.Print GetDateFormat("01/01/2024")   ' MM/DD/YYYY
    Debug.Print GetDateFormat("01-01-2024")   ' MM-DD-YYYY
    
    Debug.Print GetDateFormat("2024-01-01 2:30:45")    ' YYYY-MM-DD HH24:MI:SS
    Debug.Print GetDateFormat("2024-01-01 12:3:45")    ' YYYY-MM-DD HH24:MI:SS
    Debug.Print GetDateFormat("2024-01-01 12:30:5")    ' YYYY-MM-DD HH24:MI:SS
    
    Debug.Print GetDateFormat("20240101123045")        ' YYYYMMDDHH24MISS
    Debug.Print GetDateFormat("InvalidDate")           ' Unknown format
End Sub

Function GetDateFormat(inputStr As String) As String
    Dim fmt As String
    
    ' 判断是否包含空格(即是否包含时间部分)
    If InStr(inputStr, " ") > 0 Then
        ' 包含空格,说明是带时间的日期格式
        If InStr(inputStr, "-") > 0 Then
            ' 格式:YYYY-MM-DD HH24:MI:SS 或 YYYY-MM-DD HH24:MI
            If CheckFormatWithTime(inputStr, "-", "YYYY-MM-DD HH24:MI:SS") Then
                fmt = "YYYY-MM-DD HH24:MI:SS"
            ElseIf CheckFormatWithTime(inputStr, "-", "YYYY-MM-DD HH24:MI") Then
                fmt = "YYYY-MM-DD HH24:MI"
            ElseIf CheckFormatWithTime(inputStr, "-", "YYYY-MM-DD HH24") Then
                fmt = "YYYY-MM-DD HH24"
            End If
        ElseIf InStr(inputStr, "/") > 0 Then
            ' 格式:YYYY/MM/DD HH24:MI:SS 或 YYYY/MM/DD HH24:MI
            If CheckFormatWithTime(inputStr, "/", "YYYY/MM/DD HH24:MI:SS") Then
                fmt = "YYYY/MM/DD HH24:MI:SS"
            ElseIf CheckFormatWithTime(inputStr, "/", "YYYY/MM/DD HH24:MI") Then
                fmt = "YYYY/MM/DD HH24:MI"
            ElseIf CheckFormatWithTime(inputStr, "/", "YYYY/MM/DD HH24") Then
                fmt = "YYYY/MM/DD HH24"
            End If
        End If
    Else
        ' 不包含空格,可能是紧凑格式或仅日期格式
        If InStr(inputStr, "-") > 0 Then
            ' 格式:YYYY-MM-DD 或 MM-DD-YYYY
            If CheckFormatWithoutTime(inputStr, "-", "YYYY-MM-DD") Then
                fmt = "YYYY-MM-DD"
            ElseIf CheckFormatWithoutTime(inputStr, "-", "MM-DD-YYYY") Then
                fmt = "MM-DD-YYYY"
            End If
        ElseIf InStr(inputStr, "/") > 0 Then
            ' 格式:YYYY/MM/DD 或 MM/DD/YYYY
            If CheckFormatWithoutTime(inputStr, "/", "YYYY/MM/DD") Then
                fmt = "YYYY/MM/DD"
            ElseIf CheckFormatWithoutTime(inputStr, "/", "MM/DD/YYYY") Then
                fmt = "MM/DD/YYYY"
            End If
        ElseIf Len(inputStr) = 8 Then
            ' 格式:YYYYMMDD
            If CheckFormatYYYYMMDD(inputStr) Then
                fmt = "YYYYMMDD"
            End If
        ElseIf Len(inputStr) = 14 Then
            ' 格式:YYYYMMDDHH24MISS
            If CheckFormatYYYYMMDDHH24MISS(inputStr) Then
                fmt = "YYYYMMDDHH24MISS"
            End If
        End If
    End If
    
    ' 如果没有匹配到任何格式,返回未知格式
    If fmt = "" Then
        fmt = "Unknown format"
    End If
    
    GetDateFormat = fmt
End Function

' 检查带时间部分的格式
Private Function CheckFormatWithTime(s As String, separator As String, formatModel As String) As Boolean
    Dim regex As Object
    Set regex = CreateObject("VBScript.RegExp")
    
    Select Case formatModel
        Case "YYYY-MM-DD HH24:MI:SS", "YYYY/MM/DD HH24:MI:SS"
            regex.pattern = "^\d{4}" & separator & "(0?[1-9]|1[0-2])" & separator & "(0?[1-9]|[12]\d|3[01]) ([01]?\d|2[0-3]):([0-5]?\d):([0-5]?\d)$"
        Case "YYYY-MM-DD HH24:MI", "YYYY/MM/DD HH24:MI"
            regex.pattern = "^\d{4}" & separator & "(0?[1-9]|1[0-2])" & separator & "(0?[1-9]|[12]\d|3[01]) ([01]?\d|2[0-3]):([0-5]?\d)$"
        Case "YYYY-MM-DD HH24", "YYYY/MM/DD HH24"
            regex.pattern = "^\d{4}" & separator & "(0?[1-9]|1[0-2])" & separator & "(0?[1-9]|[12]\d|3[01]) ([01]?\d|2[0-3])$"
    End Select
    
    CheckFormatWithTime = regex.Test(s)
End Function

' 检查不带时间部分的格式
Private Function CheckFormatWithoutTime(s As String, separator As String, formatModel As String) As Boolean
    Dim regex As Object
    Set regex = CreateObject("VBScript.RegExp")
    
    Select Case formatModel
        Case "YYYY-MM-DD", "YYYY/MM/DD"
            regex.pattern = "^\d{4}" & separator & "(0?[1-9]|1[0-2])" & separator & "(0?[1-9]|[12]\d|3[01])$"
        Case "MM-DD-YYYY", "MM/DD/YYYY"
            regex.pattern = "^(0?[1-9]|1[0-2])" & separator & "(0?[1-9]|[12]\d|3[01])" & separator & "\d{4}$"
    End Select
    
    CheckFormatWithoutTime = regex.Test(s)
End Function

' 检查格式:YYYYMMDD
Private Function CheckFormatYYYYMMDD(s As String) As Boolean
    Dim regex As Object
    Set regex = CreateObject("VBScript.RegExp")
    regex.pattern = "^\d{4}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])$"
    CheckFormatYYYYMMDD = regex.Test(s)
End Function

' 检查格式:YYYYMMDDHH24MISS
Private Function CheckFormatYYYYMMDDHH24MISS(s As String) As Boolean
    Dim regex As Object
    Set regex = CreateObject("VBScript.RegExp")
    regex.pattern = "^\d{4}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])([01]\d|2[0-3])([0-5]\d)([0-5]\d)$"
    CheckFormatYYYYMMDDHH24MISS = regex.Test(s)
End Function

输入内容如下:

Debug.Print GetDateFormat("20240101")
Debug.Print GetDateFormat("2024-01-01")
Debug.Print GetDateFormat("2024/01/01")
Debug.Print GetDateFormat("2024-01-01 12:30:45")
Debug.Print GetDateFormat("2024/01/01 12:30:45")

Debug.Print GetDateFormat("2024-01-01 12:30")
Debug.Print GetDateFormat("2024/01/01 12:30")

Debug.Print GetDateFormat("2024-01-01 12")
Debug.Print GetDateFormat("2024/01/01 12")

Debug.Print GetDateFormat("01/01/2024")
Debug.Print GetDateFormat("01-01-2024")

Debug.Print GetDateFormat("2024-01-01 2:30:45")
Debug.Print GetDateFormat("2024-01-01 12:3:45")
Debug.Print GetDateFormat("2024-01-01 12:30:5")

Debug.Print GetDateFormat("20240101123045")
Debug.Print GetDateFormat("InvalidDate")

运行结果如下:

YYYYMMDD
YYYY-MM-DD
YYYY/MM/DD
YYYY-MM-DD HH24:MI:SS
YYYY/MM/DD HH24:MI:SS
YYYY-MM-DD HH24:MI
YYYY/MM/DD HH24:MI
YYYY-MM-DD HH24
YYYY/MM/DD HH24
MM/DD/YYYY
MM-DD-YYYY
YYYY-MM-DD HH24:MI:SS
YYYY-MM-DD HH24:MI:SS
YYYY-MM-DD HH24:MI:SS
YYYYMMDDHH24MISS
Unknown format

http://www.kler.cn/a/578509.html

相关文章:

  • 解锁DeepSpeek-R1大模型微调:从训练到部署,打造定制化AI会话系统
  • IO多路复用实现并发服务器
  • 三、滑动窗口——9. 找到字符串中所有字母异位词
  • c++20 在 <chrono> 中的 日历 和 时区 库
  • cmd中有cl但是conda虚拟环境没用cl
  • 【Recon】Git源代码泄露题目解题方法
  • Java在word中动态增加表格行并写入数据
  • 中级网络工程师面试题参考示例(4)
  • 以太网口的协议与电路波形
  • Scaled_dot_product_attention(SDPA)使用详解
  • Web3 与去中心化技术:如何改变数据所有权
  • C语言数据结构:链表的操作实现
  • STM32全系大阅兵(1)
  • Java Lambda 表达式在集合操作中的应用
  • 大语言模型下的多智能体协作机制研究综述
  • kettle工具使用从入门到精通(二)-------Java代码案例
  • 八字排盘宝 2025.1.8 | 多模式排盘工具,精准解析八字信息,轻量易用
  • 【机器学习chp11】聚类(K均值+高斯混合模型+层次聚类+基于密度的聚类DBSCAN+基于图的聚类+聚类的性能评价指标)
  • Unity之如何实现哔哩哔哩直播弹幕游戏
  • Python脚本,音频格式转换 和 视频格式转换