在Excel中使用单个格式参数(如to_DATE、datetime.ParseExact)将字符串转换为datetime?
是否有一个函数可以使用Excel中作为参数提供的datetime格式将字符串转换为datetime 您可以在不同的平台上想象如下类似的功能:在Excel中使用单个格式参数(如to_DATE、datetime.ParseExact)将字符串转换为datetime?,excel,vba,datetime,type-conversion,to-date,Excel,Vba,Datetime,Type Conversion,To Date,是否有一个函数可以使用Excel中作为参数提供的datetime格式将字符串转换为datetime 您可以在不同的平台上想象如下类似的功能: PLSQL: TO_DATE("20191301","YYYYDDMM") C#: DateTime.ParseExact("20191301","YYYYDDMM", null) 此函数可能会根据需要返回结果(您可以根据需要进行修改) 根据你提供的字符串 A1单元 29.10.2018:17:48:10 用这个 =DATEVALUE(SUBSTITU
PLSQL: TO_DATE("20191301","YYYYDDMM")
C#: DateTime.ParseExact("20191301","YYYYDDMM", null)
此函数可能会根据需要返回结果(您可以根据需要进行修改)
根据你提供的字符串 A1单元
29.10.2018:17:48:10
用这个
=DATEVALUE(SUBSTITUTE(LEFT(A1,FIND(":",A1)-1),".","/"))+TIMEVALUE(MID(A1,FIND(":",A1)+1,20))
以下是对用户定义的工作表函数的尝试:
- 函数返回日期时间值
- 支持的格式字符串部分:yyy、yy、mmm、MM、dd、hh、MM、ss
- 上午,上午,上午。m、 ,下午,下午,下午。M它们的大写字母都是等价的
- 只有MM(月)和MM(分钟)区分大小写,
MMM或MMM等于一月、二月 - 80以下的两位数年份为20xx,80或以上的年份为19xx
- 格式字符串必须与源字符串具有相同的长度,
否则返回#N/A错误 - 填充字符可以是空白、冒号、双冒号或其他
Public函数以_DATE(ByRef src作为字符串,ByRef frmt作为字符串)作为变量
暗y为长,m为长,d为长,h为长,最小为长,s为长
将am设置为布尔值,将pm设置为布尔值
变暗位置尽可能长
如果Len(src)Len(frmt),则
截止日期=CVErr(xlErrNA)#无错误
退出功能
如果结束
pos=InStr(1,frmt,“yyyy”,vbTextCompare)
如果位置>0,则
y=Val(中间(src,位置4))
其他:pos=InStr(1,frmt,“yy”,vbTextCompare)
如果位置>0,则
y=Val(中间(src,位置2))
如果y<80,则y=y+2000,否则y=y+1900
如果结束
如果结束
位置=仪表(1,frmt,“mmm”,VBTEXT比较)
如果位置>0,则
m=月份(日期值(“01”和(中期(src,pos,3))和“2000”))
其他:pos=InStr(1,frmt,“MM”,vbBinaryCompare)
如果位置>0,则m=Val(中间(src,位置2))
如果结束
pos=仪表(1,frmt,“dd”,VBTEXT比较)
如果位置>0,则d=Val(中间(src,位置2))
pos=仪表(1,frmt,“hh”,VBTEXT比较)
如果位置>0,则h=Val(中间(src,位置2))
如果InStr(1,src,“am”,vbTextCompare)>0,则am=True
如果InStr(1,src,“a.m.”,vbTextCompare)>0,则am=True
如果InStr(1,src,“a.m.”,vbTextCompare)>0,则am=True
如果InStr(1,src,“pm”,vbTextCompare)>0,则pm=True
如果InStr(1,src,“p.m.”,vbTextCompare)>0,则pm=True
如果InStr(1,src,“p.m.”,vbTextCompare)>0,则pm=True
如果am和h=12,则h=0
如果pm和h 12,则h=h+12
位置=仪表(1,frmt,“mm”,vbBinaryCompare)
如果位置>0,则最小值=Val(中间值(src,位置2))
位置=仪表(1,frmt,“ss”,VBTEXT比较)
如果位置>0,则s=Val(中间(src,位置2))
截止日期=日期序列(y,m,d)+时间序列(h,min,s)
端函数
DateValue接受字符串并返回真实日期。在什么意义上,接受特定类型输入并返回特定输出的函数是泛型函数?我怀疑你没有使用“泛型”的标准含义。请参阅:。在上下文中,我猜想您是指内置的。您能给我们展示一个您想要转换的日期示例吗?=VALUE()
或=DATEVALUE()
,因为工作表公式正是这样做的。您不需要VBA。我认为只有当日期字符串具有内置函数中定义的预定义格式时,这些函数才能转换。我可以将29.10.2018:17:48:10
转换为日期时间吗?如果有内置的工作表函数可以执行此操作,则此处完全不需要VBA。此外,您的函数假定字符串的格式,如果能够传入格式化字符串以指定datatime格式,则更有意义。您的解决方案仅适用于注释中的示例“29.10.2018:17:48:10”,而不适用于问题中的示例“20191301”。正确,但op与日期和时间有关,这些函数示例仅限于日期和时间。唯一显式定义了日期和时间的字符串op是comments.Nice和simple解析方法中的字符串op。很荣幸能保持代码简短。这就是我要找的。非常感谢阿斯格。顺便问一下,我怎样才能将AM/PM功能添加到这段代码中,或者你可以用这个功能进行更新?@AliTor我刚刚对它进行了完全编辑,以获得AM/PM。这是一个很棒的功能。它甚至适用于日期字符串,如“Wed,2020年1月29日07:00:55+0000”:TO_date(标准日期,“Day,DD-MMM-YYYY-hh:mm:ss+0000”)
=DATEVALUE(SUBSTITUTE(LEFT(A1,FIND(":",A1)-1),".","/"))+TIMEVALUE(MID(A1,FIND(":",A1)+1,20))
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