提问人:sutterhome1971 提问时间:2/14/2013 更新时间:7/29/2017 访问量:4104
如何将小数年(例如 1.25 年)转换为天数
How to convert fractional years (say 1.25 years) to number of days
问:
我有一个表格,显示了 1 年到 10 年的周期。我想计算天数(一年中大约 365 天,无需包括闰年)。如果只是年,则很容易计算天数(例如 2 年 = 2*365 天)。但是,如何将 1.5 年或 1.75 年转换为天呢?
如果年份以小数年指定,计算天数的有效方法是什么。
谢谢 纳特
答:
3赞
iambriansreed
2/14/2013
#1
尝试:
float year = 1.5;
int days = Math.Round(year * 365);
1赞
Ohad Schneider
7/29/2017
#2
由于最初的问题很简单,我将回答一个更有趣的问题,其中要考虑闰年和其他日期/时间的奇异情况。由于一年中的确切天数取决于所讨论的年份,因此唯一明智的方法是相对于给定日期进行计算。第一步是接受值的重载:AddYears
double
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);
}
上一个:JAVA:BMI计算器
评论
1.25 * 365 = 456.25
1.5 * 365 = 547.5
Math.Round(1.5 * 365)
1.5 * 365