我有一列日期类字符串值,格式为yyyy-mm-dd
,例如2011-Sep-13
。我需要将它们转换为 Excel 日期序列号,以便在公式中使用它们。
DATEVALUE 无法识别这种格式;我#VALUE!
尝试时才成功。它也不采用自定义日期格式(与大多数编程语言不同)。
如何将任意日期格式转换为 Excel 日期值?
答案1
您需要进行字符串解析,然后将适当格式的值传递进去DATEVALUE
– 如下所示:
=DATEVALUE(RIGHT(A1,2)&"-"&MID(A1,6,3)&"-"&LEFT(A1,4))
(编辑:更新公式 - 经过测试并且在一个例子中对我有用 - 可能需要根据您的输入进行改进)
答案2
请注意,月份名称是 Windows 区域选项所特有的。因此,如果您的 Windows 区域选项设置为乌克兰语,则 DATEVALUE 将为“07-Nov-2012”返回 #VALUE!,但会接受“07-Лис-2012”。
答案3
Excel 的 DateValue 函数与地区相关。如果您解析“04-11-2008”这样的字符串,在欧洲将被解析为 11 月 4 日,而在美国将被解析为 4 月 11 日。
为了解决这个问题,您可以使用 DateSerial 函数并自行进行解析。这也可以轻松适应您自己的非标准日期格式。
' Region independent date parsing
' Expects a datetimestr in the format "04-11-2008 21:39:39"
' The function VBA.DateTime.DateValue() mixes up the date and month in different regions
Function parseDateTime(dateTimeStr As String) As Date
Dim parts As Variant
parts = VBA.Strings.Split(dateTimeStr, " ")
Dim datePart As String, timePart As String
datePart = parts(0)
timePart = parts(1)
Dim dateParts As Variant, day As Integer, month As Integer, year As Integer
dateParts = VBA.Strings.Split(datePart, "-")
day = dateParts(0)
month = dateParts(1)
year = dateParts(2)
Dim parsed_date As Date, parsed_time As Date
parsed_date = VBA.DateTime.DateSerial(year, month, day)
parsed_time = VBA.DateTime.TimeValue(timePart)
parseDateTime = parsed_date + parsed_time
End Function
答案4
正如其他人所指出的,Excel DATEVALUE 函数依赖于区域或语言环境。要解析 yyyy-mm-dd,您可以使用带有显式解析的 DATE 函数:
=DATE(LEFT(A1,4), MID(A1,6,2), RIGHT(A1,2))
对于可变大小的字段,例如 2021-9-9,它会变得有点有趣(可能有更简单的方法):
=DATE(LEFT(A1,FIND("-",A1)-1), MID(A1,FIND("-",A1)+1,FIND("-",MID(A1,FIND("-",A1)+1,99))-1), MID(A1,FIND("-",A1)+FIND("-",MID(A1,FIND("-",A1)+1,99))+1,99))