繁体   English   中英

使用单独的格式参数(如 TO_DATE、DateTime.ParseExact)在 Excel 中将字符串转换为日期时间?

[英]Convert string to datetime in Excel with individual format parameter (like TO_DATE, DateTime.ParseExact)?

是否有使用 Excel 中作为参数给出的日期时间格式将字符串转换为日期时间的函数?

您可以在不同平台上想象以下类似的功能:

PLSQL: TO_DATE("20191301","YYYYDDMM")
C#: DateTime.ParseExact("20191301","YYYYDDMM", null)

这是对用户定义的工作表函数的尝试:

  • 函数返回日期时间值
  • 支持的格式字符串部分:yyyy、yy、mmm、MM、dd、hh、mm、ss
  • am, am, am, pm, pm, pm 和它们的大写都是等价的
  • 只有 MM(月)和 mm(分钟)区分大小写,
    MMM 或 mmm 等于 Jan、Feb、...
  • 80 岁以下的两位数年份是 20xx,80 岁或以上是 19xx
  • 格式字符串必须与源字符串具有相同的长度,
    否则返回 #N/A 错误
  • 填充字符可以是空白、冒号、双冒号或其他

例子: VBA 中的 TO_DATE DateTime.ParseExact 示例

编辑:

Public Function TO_DATE(ByRef src As String, ByRef frmt As String) As Variant
    Dim y As Long, m As Long, d As Long, h As Long, min As Long, s As Long
    Dim am As Boolean, pm As Boolean
    Dim pos As Long

    If Len(src) <> Len(frmt) Then
        TO_DATE = CVErr(xlErrNA)  ' #N/A error
        Exit Function
    End If

    pos = InStr(1, frmt, "yyyy", vbTextCompare)
    If pos > 0 Then
        y = Val(Mid(src, pos, 4))
    Else: pos = InStr(1, frmt, "yy", vbTextCompare)
        If pos > 0 Then
            y = Val(Mid(src, pos, 2))
            If y < 80 Then y = y + 2000 Else y = y + 1900
        End If
    End If

    pos = InStr(1, frmt, "mmm", vbTextCompare)
    If pos > 0 Then
        m = month(DateValue("01 " & (Mid(src, pos, 3)) & " 2000"))
    Else: pos = InStr(1, frmt, "MM", vbBinaryCompare)
        If pos > 0 Then m = Val(Mid(src, pos, 2))
    End If

    pos = InStr(1, frmt, "dd", vbTextCompare)
    If pos > 0 Then d = Val(Mid(src, pos, 2))

    pos = InStr(1, frmt, "hh", vbTextCompare)
    If pos > 0 Then h = Val(Mid(src, pos, 2))
    If InStr(1, src, "am", vbTextCompare) > 0 Then am = True
    If InStr(1, src, "a.m.", vbTextCompare) > 0 Then am = True
    If InStr(1, src, "a. m.", vbTextCompare) > 0 Then am = True
    If InStr(1, src, "pm", vbTextCompare) > 0 Then pm = True
    If InStr(1, src, "p.m.", vbTextCompare) > 0 Then pm = True
    If InStr(1, src, "p. m.", vbTextCompare) > 0 Then pm = True
    If am And h = 12 Then h = 0
    If pm And h <> 12 Then h = h + 12

    pos = InStr(1, frmt, "mm", vbBinaryCompare)
    If pos > 0 Then min = Val(Mid(src, pos, 2))

    pos = InStr(1, frmt, "ss", vbTextCompare)
    If pos > 0 Then s = Val(Mid(src, pos, 2))

    TO_DATE = DateSerial(y, m, d) + TimeSerial(h, min, s)
End Function

可能是这个函数如你所愿返回结果(你可以修改以适应)

Function Convert2Date(s) As Date
Dim a           As Variant

a = Split(s, "/")
Convert2Date = DateSerial(a(2), a(1), a(0))
End Function

根据您提供的字符串

单元格 A1

29.10.2018:17:48:10

用这个

=DATEVALUE(SUBSTITUTE(LEFT(A1,FIND(":",A1)-1),".","/"))+TIMEVALUE(MID(A1,FIND(":",A1)+1,20))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM