如何将小数年(例如 1.25 年)转换为天数

How to convert fractional years (say 1.25 years) to number of days

提问人:sutterhome1971 提问时间:2/14/2013 更新时间:7/29/2017 访问量:4104

问:

我有一个表格,显示了 1 年到 10 年的周期。我想计算天数(一年中大约 365 天,无需包括闰年)。如果只是年,则很容易计算天数(例如 2 年 = 2*365 天)。但是,如何将 1.5 年或 1.75 年转换为天呢?

如果年份以小数年指定,计算天数的有效方法是什么。

谢谢 纳特

#C#-3.0

评论

2赞 2/14/2013
这同样简单:......1.25 * 365 = 456.25
0赞 D.Shawley 2/14/2013
我错过了什么吗?1.5年不就是吗?1.5 * 365 = 547.5
3赞 iambriansreed 2/14/2013
真? 有愚蠢的问题。Math.Round(1.5 * 365)
0赞 IAbstract 2/14/2013
也许问题对我来说太简单了?...很明显,你乘以.这在某种程度上不能回答这个问题吗?1.5 * 365
0赞 FreudianSlip 2/14/2013
我的基本数学也是一样的......?

答:

3赞 iambriansreed 2/14/2013 #1

尝试:

float year = 1.5;

int days = Math.Round(year * 365);
1赞 Ohad Schneider 7/29/2017 #2

由于最初的问题很简单,我将回答一个更有趣的问题,其中要考虑闰年和其他日期/时间的奇异情况。由于一年中的确切天数取决于所讨论的年份,因此唯一明智的方法是相对于给定日期进行计算。第一步是接受值的重载:AddYearsdouble

public static DateTime AddYears(this DateTime dateTime, double years)
{
    int roundedYears = (int) Math.Floor(years);
    var roundedDate = dateTime.AddYears(roundedYears);
    var lastYearSpan = roundedDate.AddYears(1) - roundedDate;
    return roundedDate.AddDays((years % 1) * lastYearSpan.TotalDays);
}

现在,您可以获取对您有意义的天数,例如:

var now = DateTime.UtcNow;
Console.WriteLine((now.AddYears(1.25) - now).TotalDays); 

测试示例:

public void TestAddYearsDouble()
{
    var date = new DateTime(2000, 1, 15); //middle of the month to keep things simple
    Assert.AreEqual(date.Year + 1, date.AddYears(1.0).Year);
    Assert.AreEqual(date.Month, date.AddYears(1.0).Month);
    Assert.AreEqual(date.Year, date.AddYears(0.0833).Year);
    Assert.AreEqual(date.Month + 1, date.AddYears(0.0833).Month);
    Assert.AreEqual(date.Year + 8, date.AddYears(8.5).Year);
    Assert.AreEqual(date.Month + 6, date.AddYears(8.5).Month);
}