Excel 2013中的date逻辑

以下公式适用于大多数date组合:

=IF(INT(B2)=INT(NOW()),"Today",IF(DAYS(NOW(),B2)>365,IF(DAYS(NOW(),B2)/365.25>1,YEAR(NOW())-YEAR(B2),0)&" years, ","")&IF(IF(MONTH(NOW())-MONTH(B2)<0,MONTH(NOW())-(MONTH(B2)-11),IF(DAYS(NOW(),B2)<28,0,MONTH(NOW())-MONTH(B2)))=0,"",IF(MONTH(NOW())-MONTH(B2)<0,MONTH(NOW())-(MONTH(B2)-11),IF(DAYS(NOW(),B2)<28,0,MONTH(NOW())-MONTH(B2)))&" months and ")&IF(DAY(NOW())-DAY(B2)<0,VLOOKUP(MONTH(B2),{1,31;2,28;3,31;4,30;5,31;6,30;7,31;8,31;9,30;10,31;11,30;12,31},2)-DAY(B2)+DAY(NOW()),DAY(NOW())-DAY(B2))&" days") 

除了B2是16/02/2015 15:19:00和NOW()是08/02/2016 14:54结果是20天,但显然应该是11个月和30天 。 我正在努力寻找我的逻辑漏洞。

你的function似乎是使用朱利安年的长度,而不是更复杂的公历。 这就是为什么你的函数的健壮性会有问题的原因之一。

幸运的是,Excel有一个可以使用的内置函数DATEDIF 。 但是,由于某种原因,这是一个隐藏的function! (我完全不知道为什么)。

如果A1和A2包含这两个date,请使用

=DATEDIF(A1,A2,"y") & " years, " & DATEDIF(A1,A2,"ym") & " months, " & DATEDIF(A1,A2,"md") & " days"

A1必须早于A2。

由于DATEDIF(date1,date2,“md”)本质上产生随机数

 DAY(dates2)<DAY(date1) 

这里有一个可能的公式解决scheme(我的开始和结束date在A2和B2中): –

年份

 =DATEDIF(A2,B2,"y") 

 =DATEDIF(A2,B2,"m") 

 =IF(DAY(B2)>=DAY(A2),DAY(B2)-DAY(A2),DAY(B2)-DAY(A2)+DAY(EOMONTH(A2,0))) 

这里有几个testing用例:

在这里输入图像说明

对于其他想要做同样的事情,这是我的工作function:

 =IF(DAYS(NOW(),B2)>0,CONCATENATE(IF(DATEDIF(B2,NOW(),"y")=0,"",DATEDIF(B2,NOW(),"y")),IF(DATEDIF(B2,NOW(),"y")=0,"", " year"),IF(DATEDIF(B2,NOW(),"y")>1,"s",""),IF(AND(DATEDIF(B2,NOW(),"y")>0,DATEDIF(B2,NOW(),"ym")>0),IF(IF(AND(DATEDIF(B2,NOW(),"md")>0,OR(DATEDIF(B2,NOW(),"y")>0,DATEDIF(B2,NOW(),"ym")>0))," and ","")=""," and ",", "),""),IF(DATEDIF(B2,NOW(),"ym")=0,"",DATEDIF(B2,NOW(),"ym")),IF(DATEDIF(B2,NOW(),"ym")=0,"", " month"),IF(DATEDIF(B2,NOW(),"ym")>1,"s",""),IF(AND(DATEDIF(B2,NOW(),"md")>0,OR(DATEDIF(B2,NOW(),"y")>0,DATEDIF(B2,NOW(),"ym")>0))," and ",""),IF(DATEDIF(B2,NOW(),"md")=0,"",DATEDIF(B2,NOW(),"md")),IF(DATEDIF(B2,NOW(),"md")=0,"", " day"),IF(DATEDIF(B2,NOW(),"md")>1,"s","")),"Less than a day") 

给出了“1年,5个月,15天”的结果。