使用单独的格式参数(如 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)
可能是这个函数returns结果如你所愿(你可以修改以适应)
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))
这是对用户定义的工作表函数的尝试:
- 函数returns日期时间值
- 支持的格式字符串部分:yyyy、yy、mmm、MM、dd、hh、mm、ss
- 上午,a.m。米,下午,p.m。米。并且它们的大写字母都是等价的
- 只有MM(月)和mm(分)区分大小写,
MMM 或 mmm 等于一月、二月、...
- 2位数80以下为20xx,80以上为19xx
- 格式字符串的长度必须与源字符串的长度相同,
否则 returns #N/A 错误
- 填充字符可以是空格、冒号、双冒号或其他
例子:
编辑:
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
是否有一个函数可以使用 Excel 中作为参数给出的日期时间格式将字符串转换为日期时间?
你可以想象一下在不同平台上的类似功能:
PLSQL: TO_DATE("20191301","YYYYDDMM")
C#: DateTime.ParseExact("20191301","YYYYDDMM", null)
可能是这个函数returns结果如你所愿(你可以修改以适应)
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))
这是对用户定义的工作表函数的尝试:
- 函数returns日期时间值
- 支持的格式字符串部分:yyyy、yy、mmm、MM、dd、hh、mm、ss
- 上午,a.m。米,下午,p.m。米。并且它们的大写字母都是等价的
- 只有MM(月)和mm(分)区分大小写,
MMM 或 mmm 等于一月、二月、... - 2位数80以下为20xx,80以上为19xx
- 格式字符串的长度必须与源字符串的长度相同,
否则 returns #N/A 错误 - 填充字符可以是空格、冒号、双冒号或其他
例子:
编辑:
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