如何在 c# 中分析输出为“两个月”的日期时间范围

本文关键字:两个月 日期 范围 时间 输出 | 更新日期: 2023-09-27 18:37:21

是否有一些 c# 日期解析器从两个日期返回如下格式:

- two days
- one month
- two years

或类似的东西?

例:

日期时间 1 = 10/11/2013

日期时间 2 = 11/12/2013

输出:"一个月零一天"

我已经搜索过,没有找到关于这种解析器的信息。

如何在 c# 中分析输出为“两个月”的日期时间范围

在测量两个日期之间的间隔并以"1Y 2M 3D"的形式将结果作为字符串给出时,自然假设是使用 .NET TimeSpan 类。 但这一假设不足,因为 TimeSpan 仅测量天、小时、分钟和秒,并且没有提供有关已用月数的任何信息。 或者几年。 这意味着您将不得不深入研究日历以了解特定月份的天数等等。

可用于解决问题的帮助程序方法是...

  private static String Interval(DateTime start, DateTime end)
    {
        if (end <= start)
        {
            throw new Exception("Invalid interval");
        }
        int days = 0;
        int months = 0;
        int years = 0;
        DateTime temp = start;
        while (start.AddYears(years) <= end)
        {
            ++years;
        }
        --years;
        temp = temp.AddYears(years);
        while (temp.AddMonths(months) <= end)
        {
            ++months;
        }
        --months;
        temp = temp.AddMonths(months);
        while (temp.AddDays(days) <= end)
        {
            ++days;
        }
        --days;
        StringBuilder result = new StringBuilder();
        if (years > 0)
        {
            result.AppendFormat("{0}Y ", years);
        }
        if (months > 0)
        {
            result.AppendFormat("{0}M ", months);
        }
        if (days > 0)
        {
            result.AppendFormat("{0}D", days);
        }
        return result.ToString();
    }

此方法使用本机 .NET 方法在两个日期之间递增各种计数器,并避免必须使用日历。

它产生这些结果

Start 22 Oct 2013  End 28 Oct 2013 => 6D
Start 23 Aug 2013  End 28 Oct 2013 => 2M 5D
Start  1 Jan 2012  End 28 Oct 2013 => 1Y 9M 27D

等等...

您可以使用相同的技术将间隔解析为分钟和秒。 您可以通过添加另一个变量并循环到该方法中引入数周。

    while (temp.AddDays(weeks*7) <= end)
    {
        ++weeks;
    }
    --weeks;
    temp = temp.AddDays(weeks*7);

我很抱歉格式不佳,似乎代码格式化程序已经向南走。

Triva:传奇人物乔恩·斯基特(Jon Skeet)对同样的问题进行了破解,但随后写道他没有时间完成答案。 如何获得年/月/周/日中两个日期之间的差异?

您应该使用 TimeSpan 类型的对象,该对象是通过从一个 DateTime 中减去另一个 DateTime 来获得的。

然后,您只需要使用格式化输出字符串。

DateTime dateTime1 = new DateTime(2000, 01, 01, 0, 0, 0);
DateTime dateTime2 = new DateTime(2001, 02, 02, 10, 10, 10);
TimeSpan timeSpan1 = dateTime1 - dateTime2;
DateTime dateTime3 = new DateTime(timeSpan1.Ticks);
string string1 =
    dateTime3.Day + " days" +
    dateTime3.Month + " months" +
    dateTime3.Year + " years";

在正确的轨道上,您仍然需要计算您真正想要的值,一周中的几天,每月的天数等。