如何在 Excel 中解析非标准日期格式?

如何在 Excel 中解析非标准日期格式?

我有一列日期类字符串值,格式为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))

相关内容