【问题标题】:Difference between two dates expressed as years, months, days (in one column)表示为年、月、日的两个日期之间的差异(在一列中)
【发布时间】:2019-08-08 19:24:18
【问题描述】:

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

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

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

=DATEDIF (AR11, AS11, "D")

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

这些值表示为(天)数。这对于较短的持续时间很好,但对于像 987 天这样的时间,我想将值显示为更直观的东西,例如:

| 2 Years, 8 months, 17 days | 

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

| 2 Years | 8 months | 17 days |

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

有什么建议吗?

【问题讨论】:

  • 可能您应该使用已建立的库来执行此操作,因为手动计算可能会遇到闰年、时区偏移等问题。特别是因为月份的长度是可变的。
  • 是的,因为月份的长度是可变的,所以两个自称是2 Years, 8 months and 17 days 的期间可能不等长。你觉得这样好吗? (除非你应用其他一些软糖因素,比如所有月份都是 30 天)

标签: date google-sheets formatting google-sheets-formula array-formulas


【解决方案1】:

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

例子:

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 相同到 2019 年 1 月 3 日,尽管总天数(32 天或 29 天)不同。

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

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

这似乎与this website一致

您也可以对 Datedif 使用 MD 参数:

=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 语句的第一部分应该是 DAY(B1)-DAY(A1)(已编辑)。
  • 找这个答案很久了。考虑每月天数的唯一答案。在原始公式中添加了时间变量。链接my modified answer
  • @TomSharpe 我按照 Excel 文档链接并尝试重现负面/不正确的错误,但看起来谷歌表格中的 MD 工作正常。我错过了什么吗(?)docs.google.com/spreadsheets/d/…
  • 我不确定,对于 31/1/19 到 1/3/19 GS 和 Excel 中的 datedif(a1,b1,"MD") 给出 -2 可能被认为有一些由于二月份的天数,有点逻辑,但我认为这不是很有帮助,并且与引用的任何一个网站都不一致。
【解决方案2】:
=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)"))

【讨论】:

  • 二月是 28(或 29!)天,而不是 30 天。很多个月是 31 天。
  • @tehhowch 这是真的,但不相关。如果您说“2 个月前”,您通常不是指 59 天前,因为 jan31+feb28。你的意思是 2 个月作为 30 天平均值的标准单位
  • “几个月前”和“几年前”的问题在于它们本质上是模棱两可的。 “2 个月前”可能意味着“1 月的某个时候”或“1 月 18 日”。因此,如果您非常具体地还计算了差异的天数,那么您当然暗示您正在正确地进行月份计算(阅读:完全正确)
  • 太棒了,格式精美,效果很好。适应有点痛苦,我的工作表版本需要分号而不是逗号,但它有效!
【解决方案3】:
=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

【讨论】:

  • 第一个公式有效,但显然因为它不返回一个简单的数值,它破坏了我一直应用于该列的条件格式(我省略了说我也在做)。我尝试使用第二个公式(我正在回复的那个)来使用单独的列,但它似乎不起作用 - 我遇到了错误。另外,我不确定上面的公式是否应该用于 Years 列(如屏幕截图中所示)。如果仅适用于年列,我应该为月/日列修改哪些参数?
  • 你不需要修改任何东西......它会自动填充。在这里,我为您制作了一个电子表格,您可以在其中正确检查它:docs.google.com/spreadsheets/d/…
【解决方案4】:

这是基于已经有一个具有天数差异的字段,在本例中是字段 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 向下舍入

【讨论】:

    猜你喜欢
    • 2016-03-22
    • 2014-04-07
    • 2022-10-02
    • 2013-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多