【问题标题】:Convert date e.g. Jun 05 2016 08:00:00 to dd/mm/yyyy hh:mm:ss转换日期,例如2016 年 6 月 5 日 08:00:00 至 dd/mm/yyyy hh:mm:ss
【发布时间】:2016-07-01 14:36:59
【问题描述】:

得到了输入,例如在主题标题中。 试图弄清楚如何将其转换为英国日期和时间以用于计算。

我在 Google 上查看了一些方法,例如使用文本到列,但我认为这不是我要寻找的...

谢谢!

编辑:月份始终采用缩写格式。
编辑 2:我应该提到我在英国,它似乎不会自动转换美国日期。
编辑 3:数据:

2016 年 6 月 5 日 08:00:00 至 dd/mm/yyyy hh:mm:ss

【问题讨论】:

  • DATEVALUE 提供一些有用的东西吗?
  • 不,试过这个 - 只是给出一个#value!错误
  • 您的原始日期是字符串吗?当您将单元格格式更改为一般格式时,它是否会从看起来像日期的内容变为非常大的数字?
  • 不应仅将您的数据放在主题行中,因为对于尝试使用它的人来说很难剪切和粘贴。它应该包含在您的问题正文中。

标签: excel date excel-2010


【解决方案1】:

假设您的源日期是一个字符串并且它位于单元格 D10 中,您需要做的第一件事是将其转换为 excel 日期时间序列。在 Excel 日期时间序列中,有几点需要注意。

  • 数字的整数部分在 windows 中表示自 1900 年 1 月 1 日以来的天数,在 mac 上我认为是 1904 年
  • 数字的小数部分表示一天中的时间。 0.5 代表中午。 VBA 的有效 Excel 时间是 00:00 到 23:59:59。 24:00 不是有效时间,但它适用于一些 excel 公式

因此,为了将您的字符串转换为 Excel 日期序列,我们需要提取组件并将它们转储到 DATE() 函数中。日期函数由三个参数组成:

DATE(year,month,day)

除了这些值必须是数字之外,非常简单。我们为什么不开始将您的信息从最大的单位拉到最小的单位。

谢天谢地,您的字符串长度一致。您的个位数前导 0,因此它们将占用与两位数相同的空间。所以这种方法一直有效到 9999 年,但我认为我们现在不必太担心。

为了提取年份,我们查看它在您的字符串中的位置以及它有多长。因此,通过简单地计算,我们知道它从第 8 个字符位置开始,长度为 4 个字符。我们将此信息与 MID() 函数一起使用

=MID(D10,8,4)

为了提取月份,它变得有点复杂,因为我们需要将它从缩写转换为数字。有几种方法可以做到这一点。你可以写一个很长的 IF 语句,最后会重复一个月的拉动 11 次。相反,我决定使用 MATCH() 函数并在其中构建了一个月份缩写数组。 MATCH() 函数将返回您在提供的搜索列表中搜索的内容的数量/位置。所以只要我们按时间顺序输入月份,它们的位置就会对应它们的数值。因此,我们的公式将如下所示:

MATCH(LEFT(D10,3),{"JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"},0)

LEFT() 函数用于从字符串中提取月份缩写。最后的 0 告诉 match 寻找精确匹配。需要注意的是,这种匹配方法不区分大小写。

现在,我们采用与拉年相同的负责人的那一天,我们最终得到:

=MID(D10,5,2)

我们现在可以将年月日的每个公式替换到 DATE() 函数中,我们将获得 excel 日期序列的日期部分。公式应如下所示:

=DATE(MID(D10,8,4),MATCH(LEFT(D10,3),{"JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"},0),MID(D10,5,2))

现在您需要添加时间部分或计算小数部分。为此,我首先建议尝试使用 TIMEVALUE() 函数。由于时间格式在格式上往往比日期更标准,因此它适用于您的可能性要高得多。为了使用 TIMEVALUE(),需要从字符串中提取时间部分。这可以通过 RIGHT() 函数轻松完成,如下所示:

=RIGHT(D10,8)

这将为您提供时间部分,然后可以将其替换到 TIMEVALUE() 函数中,如下所示:

=TIMEVALUE(RIGHT(D10,8))

如果 TIMEVALUE() 函数对您不起作用,那么您需要去掉小时、分钟和秒,并将它们的结果转储到 TIME() 函数中。以与为 DATE() 函数提取年份和日期相同的方式执行此操作。只需更新您的字符数。 TIME() 使用如下三个参数:

TIME(HOUR,MINUTES,SECONDS)

现在您已经确定了日期部分和时间部分,您只需将它们加在一起,即可将所有信息放入一个单元格中。生成的公式将如下所示:

=DATE(MID(D10,8,4),MATCH(LEFT(D10,3),{"JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"},0),MID(D10,5,2))+TIMEVALUE(RIGHT(D10,8))

无论您何时将该公式放在最后,请记住将单元格上的格式更改为自定义日期。如下图输入单元格自定义格式。

如果您有一列要转换的日期时间列表,只需将公式和格式化的单元格复制到您需要的位置即可。

概念证明

使用的公式

有关上述公式中使用的函数的更多信息,请点击以下链接:

{"JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC "}

{ } 用于构建自定义列表或静态数组。

【讨论】:

  • 哇,这是对正在发生的事情的非常透彻的解释!感谢您的回答、链接和解释——我开始将 Excel 视为一个非常强大的工具。直到现在,我一直在努力寻找算法代码来处理输出,但似乎 Excel 有很多我根本不知道的嵌入式功能!
【解决方案2】:

如果您不想在 VBA 中编写宏,如果格式符合您指定的格式,则单元格公式将起作用:

我假设数据在单元格 B3 中

=MID(B3,5,2) & "/" & IF(LEFT(B3,3)="Jan","01",IF(LEFT(B3,3)="Feb","02",IF(LEFT(B3,3)="Mar","03",IF(LEFT(B3,3)="Apr","04",IF(LEFT(B3,3)="May","05",IF(LEFT(B3,3)="Jun","06",IF(LEFT(B3,3)="Jul","07",IF(LEFT(B3,3)="Aug","08",IF(LEFT(B3,3)="Sep","09",IF(LEFT(B3,3)="Oct","10",IF(LEFT(B3,3)="Nov","11","12"))))))))))) & "/" & RIGHT(B3,13)

【讨论】:

  • 我必须认真研究一下直到今天我才知道存在的所有这些公式......离开了吗?中?对?求!?谢谢你lookaji :)
【解决方案3】:

DATEVALUE function 需要在日期和年份之间使用逗号; REPLACE function 可以将其添加进去。TIMEVALUE function 应该能够在不修改的情况下读取该时间。

=DATEVALUE(REPLACE(LEFT(A1, 11), 7, 0, ","))+TIMEVALUE(RIGHT(A1, 8))

注意A1中的原稿是左对齐的;这表示一个文本值。 B1 中转换的日期/时间是右对齐的;这表示一个真实的日期/时间值。

B 列的格式为dd/mm/yyyy hh:mm:ss。作为General,它将显示为42526.33333

【讨论】:

  • =--REPLACE(A1,7,0,",") 也有效(单元格编号格式为 dd/mm/yyyy hh:mm:ss )。
猜你喜欢
  • 1970-01-01
  • 2019-07-19
  • 1970-01-01
  • 2016-12-16
  • 2015-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-28
相关资源
最近更新 更多