查找C#中给定日期的最接近月末

时间:2018-01-05 12:07:49

标签: c# datetime

我想找到最近的""截止日期到特定日期。例如,如果日期为4.3.2017,则28.2.2017是最接近的日期。对于20.3.201731.3.2017是最接近的日期。对于陷入死亡中心的日期,如果我们选择更低或更高的日期并不重要。

通过以下两个帖子How do I get the last day of a month?Find the closest time from a list of times,我能够将以下方法合并在一起

public static DateTime findNearestDate(DateTime currDate)
{
    List<DateTime> dates = new List<DateTime> { ConvertToLastDayOfMonth(currDate.AddMonths(-1)), ConvertToLastDayOfMonth(currDate) };
    DateTime closestDate = dates[0];
    long min = long.MaxValue;

    foreach (DateTime date in dates)
        if (Math.Abs(date.Ticks - currDate.Ticks) < min)
        {
            min = Math.Abs(date.Ticks - currDate.Ticks);
            closestDate = date;
        }
    return closestDate;
}

public static DateTime ConvertToLastDayOfMonth(DateTime date)
{
    return new DateTime(date.Year, date.Month, DateTime.DaysInMonth(date.Year, date.Month));
}

这很有效,但似乎有很多代码可以完成这么简单的任务。有人知道更简单,更紧凑的方法吗?

3 个答案:

答案 0 :(得分:21)

鉴于只能有两个选项,这里循环似乎很奇怪。

假设你只有日期,而不需要担心一天中的时间,在我看来,这个决定只取决于当前&#34;多少天。月。如下所示:

Local<String> name = String::NewFromUtf8(isolate, *v8::String::Utf8Value(args[0]->ToString()));

答案 1 :(得分:2)

您可以计算当前和上个月的最后日期,并选择最近的日期:

public static DateTime GetNearestEOM(DateTime date)
{
    DateTime EOMPrev = new DateTime(date.Year, date.Month, 1).AddDays(-1);
    DateTime EOMNext = new DateTime(date.Year, date.Month, 1).AddMonths(1).AddDays(-1);
    DateTime NearestEOM = (date - EOMPrev).TotalDays < (EOMNext - date).TotalDays ? EOMPrev : EOMNext;
    return NearestEOM;
}

GetNearestEOM(new DateTime(2017, 3, 4));  // 2017-02-28 00:00:00
GetNearestEOM(new DateTime(2017, 3, 20)); // 2017-03-31 00:00:00

答案 2 :(得分:0)

不需要循环。您可以使用框架的内置时间跨度添加功能:

var closestendofmonth = new DateTime(date.Year, date.Month, 1).AddDays(-1);