将一个月的分数添加到日期

时间:2017-10-27 21:37:22

标签: c# datetime data-conversion

我在互联网上寻找这项功能,但无法找到任何可接受的解决方案 简单的问题, 如何在DateTime中添加1.5个月, AddMonth仅接受整数作为参数。 是的,我知道我可以使用AddDays,但它带来了许多其他问题,如何计算正确的天数取决于你正在寻找的飞蛾

我自己的解决方案如下,但肯定不是完美的解决方案

public static DateTime AddMonths(DateTime val, double months)
{
    int integer =(int) Math.Truncate(months);
    double fraction = months - integer;

    val = val.AddMonths(integer);

    double days = DateTime.DaysInMonth(val.Year, val.Month) * fraction;

    val = val.AddDays(days);

    return val;
}

更新: 这是一个商业项目要求。其中一种形式有发行日期(DateTime)和期限期限(double),可以定义为一个月的分数。我的问题是如何使用我的代码版本正确处理它。我知道这段代码并不是最好的,我在我的问题中指出它提出了很多你们在评论中列出的问题。那么你们有没有关于如何处理所有场景的建议?你们有没有更好的功能代码

2 个答案:

答案 0 :(得分:1)

我会把它写成一个带有以下逻辑的扩展方法,这与你的非常相似。事实上,我认为唯一的区别是你根据起始月份的天数来计算天数,并根据额外月份(最后)的差异来计算天数:

  1. 将整月和部分月份分成两个变量
  2. 将整个月份添加到日期
  3. 计算天数:
    1. 再添加一个月
    2. 从中减去第2步中的日期
    3. 获取总天数
    4. 将总天数乘以步骤1中捕获的部分月份值
  4. 将该天数添加到该月
  5. 在代码中可能更有意义:

    public static class Extensions
    {
        public static DateTime AddMonths(this DateTime startingValue, double months)
        {
            // Cast to an int to avoid recursing back to this method
            var wholeMonths = (int)Math.Floor(months);
            var partialMonth = months - wholeMonths;
    
            var result = startingValue.AddMonths(wholeMonths);
            return result.AddDays(Math.Floor(
                result.AddMonths(1).Subtract(result).TotalDays * partialMonth));
        }
    }
    

    <强>用法

    static void Main(string[] args)
    {
        var today = DateTime.Now;
        var later = today.AddMonths(3.5);
    
        Console.WriteLine($"Today: {today}");
        Console.WriteLine($"Today plus 3.5 months: {later}");
    
        Console.Write("\nDone!\nPress any key to exit...");
        Console.ReadKey();
    }
    

    enter image description here

答案 1 :(得分:1)

如果没有完整的业务要求,我认为最简单的解决方案是采用一个月中普遍接受的天数,大约为30.4167,并使用该数字进行最终计算。

public static DateTime AddMonths(DateTime val, double months)
{
    // expand out the number of days in a month to a wider value than 30.4167
    const double daysInMonth = 30.41666667;

    double days = months * daysInMonth;
    // could also just use val.AddDays(days);
    TimeSpan ts = TimeSpan.FromDays(days);
    DateTime dt = val + ts;

    return dt;
}

通过计算一年中的总天数,让我们适应闰年(每条评论):

public static DateTime AddMonths(DateTime val, double months)
{
    double daysInYear = new DateTime(val.Year, 12, 31).DayOfYear;
    double daysInMonth = daysInYear / 12;

    return val.AddDays(months * daysInMonth);
}