计算日,月,年
回答
你不能做到这一点通过直接计算(即没有“TotalMonths”或TimeSpan
“TotalYears”属性,仅仅是因为这些数字没有任何意义的时间间隔)。
相反,你可以指望的数量在一个循环中,像这样:
var dt1 = new DateTime(1990, 1, 2);
var dt2 = new DateTime(2009, 5, 9);
int years = 0;
while (dt1.AddYears(1) < dt2)
{
years ++;
dt1 = dt1.AddYears(1);
}
int months = 0;
while (dt1.AddMonths(1) < dt2)
{
months ++;
dt1 = dt1.AddMonths(1);
}
int days = (int) Math.Floor(dt2.Subtract(dt1).TotalDays);
我没有测试过这一点,所以有可能是关闭的情况的一个错误或什么的,但是这是最基本的理念。
我相信这个“保持增加一个”的方法存在一个基本问题 - 请参阅我的答案了解详情。 – 2010-09-22 06:38:19
@Jon:是的,我认为你是对的...... – 2010-09-22 06:40:06
IT工作.. – william 2010-09-22 07:03:45
我不认为框架中有任何内容可以做到这一点。 TimeSpan
不会这样做,因为天数等取决于确切的起点和终点,而不仅仅是它们之间的持续时间。
下面是做这件事的简单方式,但效率不高:
using System;
class Program
{
static void Main()
{
ShowDifference(new DateTime(1990, 1, 2),
new DateTime(2009, 5, 9));
}
static void ShowDifference(DateTime start,
DateTime end)
{
if (start > end)
{
throw new ArgumentException();
}
// See comment at the end
int years = end.Year - start.Year - 2;
while (start.AddYears(years) <= end)
{
years++;
}
years--;
Console.WriteLine("{0} years", years);
start = start.AddYears(years);
int months = 0;
while (start.AddMonths(months) <= end)
{
months++;
}
months--;
Console.WriteLine("{0} months", months);
start = start.AddMonths(months);
int days = 0;
while (start.AddDays(days) <= end)
{
days++;
}
days--;
Console.WriteLine("{0} days", days);
}
}
显然有使这种更有效的方式,但他们会繁琐。编辑:我已经改变了这种观点,并在年数方面进行了非常保守的猜测 - 它可能低于它需要的数量,但我现在不想考虑角落案例。它应该可以工作,并且这些循环都有(相当小的)上限来表示它们将运行的次数。
请注意,在每个步骤中,您应该将完整的年数/天/月数添加到起点,而不是一次只做一个月。否则,如果从1月30日到3月30日,由于从1月30日到2月28日增加了一个月,那么它将要求2个月和2天,然后在2月28日到3月28日之间增加第二个月。
希望Noda Time将让这一切更容易,当我最终得到全面完成它:)
很好的解决方案。但我认为计算月份和日期的差异会非常困难。为了计算O(1)中的年份差异,只考虑一种情况,因此方法本身将在不变的时间内运行。 – 2010-09-22 06:52:35
@Makkam:是的,这当然是可行的。这只是一个比我现在试图在这个时候尝试做的更好的手段。 – 2010-09-22 07:00:39
@Makkam:我用一种保守的妥协解决方案编辑了代码 - 我怀疑它仍然可以更高效,但我仍然确信它会工作,而且很简单:) – 2010-09-22 07:03:03
怎么这样呢?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DateTimeTest
{
class Program
{
static void Main(string[] args)
{
var dt1 = new DateTime(1990, 1, 2);
var dt2 = new DateTime(2009, 5, 9);
int days = dt2.Day - dt1.Day;
int months = dt2.Month - dt1.Month;
int years = dt2.Year - dt1.Year;
if (months < 0)
{
months += 12;
years -= 1;
}
if (days < 0)
{
dt1.AddYears(years);
dt1.AddMonths(months);
days = dt2.Subtract(dt1).Days;
months -= 1;
}
Console.WriteLine("{0} Days, {1} Months, {2} Years", days, months, years);
}
}
}
输出
7 Days, 4 Months, 19 Years
是输出你要找的人?取决于您想如何定义“月”,您可能需要一些额外的条件。
- 1. 计算日期之间的年/月/日
- 2. Php年月计算
- 3. 计算年,月,日在oracle中
- 4. 计算月份和年份的日期
- 5. Rails按月计算年龄
- 6. 按月计算年龄,天
- 7. 乳胶日期日期时间计算月份日年
- 8. 用java计算年月和日的年龄
- 9. 如何计算年,月,日的人的年龄?
- 10. 从日到月:计算月
- 11. 为什么从1970年1月1日起计算日期?
- 12. JavaScript计算开始日期的年月日
- 13. 生日年龄计算,而且数月的天数
- 14. 计算给定月份和年份的周日数
- 15. 如何计算给定日期之外的广播年月?
- 16. 根据开始日期月份计算出年龄
- 17. 如何通过dateTimePicker的的ValueChanged计算年龄年,月和日C#
- 18. 如果每个月有30天,则计算年,月,日的差异
- 19. 按日/月/年/日/月/日/年等搜索SQL查询
- 20. 年/月/日输入
- 21. 获取年,月,日
- 22. 计算Perod在年月日在JavaScript中,当从和日期输入
- 23. HQL将年/月/日变更为年 - 月 - 日
- 24. 11年3月20日上午11:24(月/日/年时:MIN)
- 25. jQuery年龄计算不计算闰年
- 26. 将日期时间拆分为日期/年/月/日名称和计数年份
- 27. Excel:计算特定月份,周,年的计费时间
- 28. 插入年,月,日,月的天数
- 29. 从两个日期计算年份
- 30. 从出生日期计算年龄
你想得到什么:(2008,2,29) - >(2009,2,28)和(2008,2,28) - >(2009,2,28)。我认为TimeSpan不支持年份和月份,因为含糊不清,计算取决于日期差异的定义。 – 2010-09-22 07:06:06