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


24

我有一列类似日期的字符串值,格式yyyy-mm-dd2011-Sep-13。我需要将它们转换为Excel日期序列号,以便可以在公式中使用它们。

DATEVALUE无法识别此格式;我刚拿到#VALUE!的时候我尝试。它还不采用自定义日期格式(与大多数编程语言不同)。

如何将任意日期格式转换为Excel日期值?

Answers:


21

您将需要进行字符串解析,然后将适当的格式化值传递到DATEVALUE–这样的事情:

=DATEVALUE(RIGHT(A1,2)&"-"&MID(A1,6,3)&"-"&LEFT(A1,4))

(编辑:更新的公式-经过测试,它对我来说是一个示例-可能需要根据您的输入进行细化)


1
+1:发布时,我已经准备好放在剪贴板上了:= DATEVALUE(RIGHT(A1,2)&MID(A1,FIND(“-”,A1),5)&MID(A1,3,2))
Excellll

嘿,我从没想过要重新排列这些位。谢谢!
Craig Walker

2
8年和更高版本的Excel之后,这仍然是最相关的答案!我希望Excel可以提供功能PARSEDATE([string_value], [date format])
Manu Manjunath

5

请注意,月份名称特定于Windows区域选项。因此,如果Windows区域选项设置为乌克兰语,则DATEVALUE将返回#VALUE!表示“ 2012年11月7日”,但会接受“ 2012年7月7日”。


1
非常非常重要的说明!遗憾的是,excel在默认情况下未同时识别区域设置和英语月份/日期名称
Athanassis

1

Excels 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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.