Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Date 以年、月、日表示的两个日期之间的差异(在一列中)_Date_Google Sheets_Formatting_Google Sheets Formula_Array Formulas - Fatal编程技术网

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

Date 以年、月、日表示的两个日期之间的差异(在一列中),date,google-sheets,formatting,google-sheets-formula,array-formulas,Date,Google Sheets,Formatting,Google Sheets Formula,Array Formulas,我在Google表单中设置了一组列,使用DATEDIF函数显示两个日期之间的差异: =DATEDIF (AS2, TODAY(), "D") (自某个日期起今天已过去的天数) (两个特定日期之间经过的天数) 这些值以天数表示。对于较短的持续时间,这很好,但对于987天之类的时间,我希望将值显示为更直观的值,例如: | 2 Years, 8 months, 17 days | 如果在同一列中不可能这样做,我至少希望有一组三列以三种不同的值类型显示此持续时间: | 2 Years | 8 m

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

=DATEDIF (AS2, TODAY(), "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
如果您接受这一点,则以下公式应适用:

一天

编辑

*我们检查了这一点,发现它做出了相同的假设——19年1月28日至19年3月1日的持续时间(1个月零1天)与19年1月31日至19年3月1日的持续时间相同,尽管总天数(32或29天)不同

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

=IF(DAY(B1)>=DAY(A1),DAY(B1)-DAY(A1),DAY(EOMONTH(A1,0))-DAY(A1)+DAY(B1))
这似乎是一致的

您还可以使用MD参数来Datedif:

=datedif(A1,B1,"MD")
但在Google Sheets和Excel中,这可能会产生一个负数,如以下警告所示:


二月是28(或29!)天,而不是30天。“很多月都是31天。”这是真的,但并不重要。如果你说“2个月前”,你通常不会仅仅因为1月31日+2月28日而指59天前。你的意思是2个月作为30天平均值的标准单位“月前”和“年前”的问题是它们本质上是模糊的。“2个月前”可能意味着“1月的某个时候”或“1月18日”。因此,如果你非常具体地计算了你的差值中的天数,你肯定会暗示你正确地(读:完全正确地)计算了月份,非常棒,格式优美,而且有效。适应起来有点痛苦,我的sheets版本想要分号而不是comas,但它能工作!可能您应该使用一个已建立的库来执行此操作,因为手动计算可能会遇到闰年、时区转换等问题。特别是因为月份的长度是可变的。是的,因为月份的长度是可变的,所以两个声称是2年、8个月和17天的周期可能不相等。你同意这样吗?(除非您应用了其他一些模糊因素,例如所有月份都是30天长的)尝试了它,天公式似乎不起作用,它返回一个负值。很抱歉,一个明显的错误,if语句的第一部分应该是天(B1)-天(A1)(编辑)。第一个公式起作用,然而,很明显,由于它不返回简单的数值,它破坏了我一直应用于该列的条件格式(我忽略了说我也在做)。我曾尝试使用第二个公式(我正在回复的公式)使用单独的列,但它似乎不起作用-我遇到了错误。此外,我不确定上面的公式是否应该用于年份列(如屏幕截图所示)。如果只针对年列,我应该为月/日列修改哪些参数?您不需要修改任何内容。。。它是自动填充的。在这里,我为您制作了一个电子表格,您可以在其中进行适当的检查:
=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))))
=IF(DAY(B1)>=DAY(A1),DAY(B1)-DAY(A1),DAY(EOMONTH(A1,0))-DAY(A1)+DAY(B1))
=datedif(A1,B1,"MD")
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")}))