我在互联网上寻找这项功能,但无法找到任何可接受的解决方案 简单的问题, 如何在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),可以定义为一个月的分数。我的问题是如何使用我的代码版本正确处理它。我知道这段代码并不是最好的,我在我的问题中指出它提出了很多你们在评论中列出的问题。那么你们有没有关于如何处理所有场景的建议?你们有没有更好的功能代码
答案 0 :(得分: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();
}
答案 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);
}