两个日期之间的差异表示为年、月、日(在一列中)

Difference between two dates expressed as years, months, days (in one column)

我在 Google 工作表中设置了一组列,使用 DATEDIF 函数显示两个日期之间的差异:

=DATEDIF (AS2, TODAY(), "D") 

(从某个日期到今天过去的天数)

=DATEDIF (AR11, AS11, "D")

(两个特定日期之间经过的天数)

这些值以天数表示。这对于较短的持续时间来说很好,但对于 987 天之类的东西,我想将值显示为更直观的内容,例如:

| 2 Years, 8 months, 17 days | 

如果在同一列中不可能,我至少希望有一组三列以三种不同的值类型显示此持续时间:

| 2 Years | 8 months | 17 days |

只需更改每一列的值类型(例如,从几天到几个月)当然会很简单,但我不确定如何继续保持显示的值相互关联(而不仅仅是在不同的持续时间类型中显示相同的值。

有什么建议吗?

我会将您的问题解释为需要完整年份、完整日历月和任何剩余天数的答案。这应该相当简单,除非包含开始日期的月份比包含结束日期的月份之前的月份多天数*。

示例:

Start Date End Date Result
28/1/19    1/3/19   1 month and 1 day
29/1/19    1/3/19   1 month and 1 day
30/1/19    1/3/19   1 month and 1 day
31/1/19    1/3/19   1 month and 1 day

如果您接受这一点,那么以下公式应该有效:

=datedif(A1,B1,"Y")

月份

=mod(datedif(A1,B1,"m"),12)

=IF(DAY(B1)>=DAY(A1),DAY(B1)-DAY(A1),DAY(EOMONTH(B1,-1))+DAY(B1)-MIN(DAY(A1),DAY(EOMONTH(B1,-1))))

编辑

*在 this website 上进行了检查,发现它做出了相同的假设 - 28/1/19 至 1/3/19 的持续时间(1 个月零一天)与 31 相同/1/19 到 1/3/19 尽管总天数(32 或 29)不同。

可能的解决方法是使用开始月份的剩余天数

=IF(DAY(B1)>=DAY(A1),DAY(B1)-DAY(A1),DAY(EOMONTH(A1,0))-DAY(A1)+DAY(B1))

这似乎与 this website

一致

您还可以将 MD 参数用于 Datedif:

=datedif(A1,B1,"MD")

但是在 Google 工作表和 Excel 中,这会产生负数,如 Excel documentation:

中警告的那样
The "MD" argument may result in a negative number, a zero, or an inaccurate result. If you are trying to calculate the remaining days after the last completed month...

=IF(DATEDIF(A1, B1, "D")>365, QUOTIENT(DATEDIF(A1, B1, "D"), 365)&" year(s) "&
                          QUOTIENT(MOD(DATEDIF(A1, B1, "D"), 365), 30)&" month(s) "&
                      MOD(QUOTIENT(MOD(DATEDIF(A1, B1, "D"), 365), 30), 30)&" day(s)",
 IF(DATEDIF(A1, B1, "D")>30,  QUOTIENT(DATEDIF(A1, B1, "D"), 30)&" month(s) "&
                                   MOD(DATEDIF(A1, B1, "D"), 30)&" day(s)", 
                                       DATEDIF(A1, B1, "D")&" day(s)"))

=IF(                 DATEDIF(A2, B2, "D")> 365, 
      SPLIT(QUOTIENT(DATEDIF(A2, B2, "D"), 365)&" "&
        QUOTIENT(MOD(DATEDIF(A2, B2, "D"), 365), 30)&" "&
    MOD(QUOTIENT(MOD(DATEDIF(A2, B2, "D"), 365), 30), 30), " "),
 IF(                 DATEDIF(A2, B2, "D")> 30, 
 {"", SPLIT(QUOTIENT(DATEDIF(A2, B2, "D"), 30)&" "&
                 MOD(DATEDIF(A2, B2, "D"), 30), " ")},
            {"", "", DATEDIF(A2, B2, "D")}))

demo spreadsheet

这是基于已经有一个具有天数差异的字段,在本例中为字段 A1(例如,将天数转换为 YMD)

=FLOOR(A1/365)&"y "&FLOOR((A1-(FLOOR(A1/365)*365))/30)&"m "&CEILING(A1-((FLOOR((A1-(FLOOR(A1/365)*365))/30)*30)+((FLOOR(A1/365))*365)))&"d"

它基于简化的一年 365 天、一个月 30 天的计算,因此并不完全准确 - 然而这似乎是其他人使用的方法。对于我的示例,它还将天数舍入为全天数 - 这可以用 FLOOR 而不是 CEILING

舍入

'Recommended Answer' 使用手动计算,即假设一年有 365 天,一个月有 30 天。要获得更精确的答案,请在 Google 工作表中使用此公式:

=ARRAYFORMULA(DATEDIF(B2:B13,C2:C13,"Y")&" years "& DATEDIF(B2:B13,C2:C13,"YM")&" months "& DATEDIF(B2:B13,C2:C13,"MD")&" days")

如果你想在没有 Arrayformula 的情况下使用:

=DATEDIF(B2,C2,"Y")&" years " & DATEDIF(B2,C2,"YM")&" months " & DATEDIF(B2,C2,"MD")&" days"

B 列:开始日期

C 列:结束日期

谢谢