【问题标题】:Calculate years, months, days between two dates计算两个日期之间的年、月、日
【发布时间】:2018-01-23 12:40:11
【问题描述】:

我试图在我正在创建的 C# 应用程序中显示两个日期之间的年、月和日。 (使用控制台进行测试)

我正在使用 NodaTime 来实现这一点,但我在数月后遇到了问题。

我已经阅读了这里的大部分问题和答案,但没有找到任何我可以从中受益的东西。

该功能在大多数情况下都有效,但有时如果天数 > 30(这将增加一个月),它不会添加月份

我正在使用此代码进行测试

LocalDate start = new LocalDate(2017, 10, 16);
LocalDate end = new LocalDate(2018, 1, 15);
Period period = Period.Between(start, end);

Console.WriteLine("{0} years, {1} months, {2} days",
                              period.Years, period.Months, period.Days);
Console.ReadLine();

(2017, 10, 16)(2018, 1, 15) 应该显示为 3 months 但它们显示为 2 个月零 30 天(我'已尝试将 +1 添加到 period.Days 但在我这样做后显示为 31 天)。我需要在显示格式时包含结束日期。

有什么我可以用来实现我需要的吗? 我需要显示正确的格式:2 年 11 个月 3 天

【问题讨论】:

  • 它在您的链接中显示或 3 个月包括结束日期。也许nodatime 不包括最后一天,但计算了该日期直到 的跨度。如果是这样,我想你可以在end 上加一天?
  • 月份并不总是……天,所以 16 号到 15 号确实比一个月少一天。 (if days > 30 (which would add a month) 没有意义,几个月不是固定的 30 天)
  • 您需要将一个月固定为 30 天,将一年固定为 365 天才能做您想做的事。在此之后,计算两个日期之间的总天数。
  • @FelipeDeveza 想到了,但如果可能的话我想显示正确的格式,我需要包括闰年和月份(30-31)中的日变化

标签: c# date nodatime


【解决方案1】:

问题确实是您在 timeanddate.com 中使用了“在计算中包含结束日期”。解决方案不是在 Noda Time 的 period 中添加一天 - 而是在执行计算之前向 end date 添加一天:

Period period = Period.Between(start, end.PlusDays(1));

这将为您提供预期的输出:

using System;
using NodaTime;

class Test
{
    static void Main()
    {
        LocalDate start = new LocalDate(2017, 10, 16);
        LocalDate end = new LocalDate(2018, 1, 15);
        Period period = Period.Between(start, end.PlusDays(1));

        Console.WriteLine(
            $"{period.Years} years, {period.Months} months, {period.Days} days");
    }
}

输出:

0 years, 3 months, 0 days

在考虑此类“介于”问题时,我喜欢尝试考虑非常简单的示例。

2018 年 1 月 23 日到 2018 年 1 月 24 日之间的时间段是多少?野田时间和我都说“1天”。 (将 1 天添加到 1 月 23 日,您将得到 1 月 24 日。)如果您谈论的是从 2018 年 1 月 23 日到 2018 年 1 月 24 日的日期间隔涵盖的时间段,那么就是两天。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    • 2022-11-18
    • 1970-01-01
    相关资源
    最近更新 更多