Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在日期上加上一个月的分数_C#_Datetime_Data Conversion - Fatal编程技术网

C# 在日期上加上一个月的分数

C# 在日期上加上一个月的分数,c#,datetime,data-conversion,C#,Datetime,Data Conversion,我在互联网上到处寻找这个功能,但找不到任何可接受的解决方案 简单的问题,, 如何在DateTime中添加1.5个月, AddMonth只接受整数作为参数。 是的,我知道我可以使用AddDays,但它带来了许多其他问题,如何计算正确的天数取决于你所看到的飞蛾 我自己的解决方案如下,但肯定不是完美的 public static DateTime AddMonths(DateTime val, double months) { int integer =(int) Math.Truncate(

我在互联网上到处寻找这个功能,但找不到任何可接受的解决方案 简单的问题,, 如何在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)可以定义为一个月的小数。我的问题就是如何用我的代码版本正确地处理它。我知道这段代码不是最好的,我在我的问题中指出,它提出了很多问题,你们在评论中列出了这些问题。你们对如何处理所有的情况有什么建议吗?你们有更好的函数代码吗?

我会用下面的逻辑编写一个扩展方法,它与你们的非常相似。事实上,我认为唯一的区别是,你根据开始月份的天数来计算天数,我根据增加一个月(在结束时)的差值来计算天数:

  • 将整个月份和部分月份分为两个变量
  • 将整个月份添加到日期
  • 要计算天数,请执行以下操作:
  • 再加上整整一个月
  • 从it中减去步骤2中的日期
  • 获取总天数差
  • 将总天数乘以步骤1中捕获的部分月份值
  • 再加上这个月的天数
  • 在代码中可能更有意义:

    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();
    }
    

    我将用以下逻辑编写此扩展方法,它与您的逻辑非常相似。事实上,我认为唯一的区别是,你根据开始月份的天数来计算天数,我根据增加一个月(在结束时)的差值来计算天数:

  • 将整个月份和部分月份分为两个变量
  • 将整个月份添加到日期
  • 要计算天数,请执行以下操作:
  • 再加上整整一个月
  • 从it中减去步骤2中的日期
  • 获取总天数差
  • 将总天数乘以步骤1中捕获的部分月份值
  • 再加上这个月的天数
  • 在代码中可能更有意义:

    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();
    }
    

    如果没有一套完整的业务需求,我认为最简单的解决方案是取一个月内普遍接受的天数,约为
    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);
    }
    

    如果没有一套完整的业务需求,我认为最简单的解决方案是采用一个月内普遍接受的天数,大约为
    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);
    }
    

    这个问题仍然模棱两可;如果日期是2017年2月20日,那么哪一个月是半个月(2月、3月或4月)?请查看FluentDateTime的nuget软件包,可以在GitHub上找到。我在我负责的一些项目中使用了它。你对一个月的.5的定义是什么?是的,可以说一个月的1/2是一年的1/24,或者在2月20日,你可以说它是
    8天+(15.5-(15.5*8/28))
    。这两个答案可能都是正确的。虽然我认为这种模糊性在某种程度上会持续整数个月,而且显然有一种公认的解决方法;如果日期是2017年2月20日,那么哪一个月是半个月(2月、3月或4月)?请查看FluentDateTime的nuget软件包,可以在GitHub上找到。我在我负责的一些项目中使用了它。你对一个月的.5的定义是什么?是的,可以说一个月的1/2是一年的1/24,或者在2月20日,你可以说它是
    8天+(15.5-(15.5*8/28))
    。这两个答案都可能是正确的。虽然我认为这种模糊性在某种程度上会持续整数个月,而且显然有一种公认的解决方法。如果我错了,请纠正我:行结果。AddMonths(1)。Subtract(result)。TotalDays计算下一个月的天数。。。在我的代码中添加了所有月份的整数后,在日期上失败的月份。我正在尝试对行DateTime.DaysInMonth(val.Year,val.Month)执行相同的操作。我只是不确定是否需要获取val.Month的天数或下一个天数。你建议得到下一个月?是的,没错-它先把整个月加起来,然后根据我们再加一个完整月的天数计算要加的百分比。不过,这两种方法可能都没有太大区别。据我理解,这与我提出的解决方案大致相同。我猜它与我的代码有相同的问题,例如,在我们添加了完整的月份数之后,它落在3月1日,扩展方法提供了更大的灵活性。。thanksI仔细检查了您的解决方案:它增加了一个月,该月的天数为该月的天数,1月份增加了31天,2月份增加了28天。这与我的代码的功能大致相同?我错过了什么吗?如果我错了,请纠正我:行结果。AddMonths(1)。Subtract(result)。TotalDays计算下一个月的天数。。。在我的代码中添加了所有月份的整数后,在日期上失败的月份。我正在尝试对行DateTime.DaysInMonth(val.Year,val.Month)执行相同的操作。我只是不确定是否需要获取val.Month的天数或下一个天数。你建议下个月去吗?是的,没错-我