是否有一些 c# 日期解析器从两个日期返回格式如下:
- two days
- one month
- two years
或类似的东西?
例子:
日期时间 1 = 10/11/2013
日期时间 2 = 2013 年 11 月 12 日
输出:“一个月零一天”
我已经搜索过,没有找到关于那种解析器的任何东西。
是否有一些 c# 日期解析器从两个日期返回格式如下:
- two days
- one month
- two years
或类似的东西?
例子:
日期时间 1 = 10/11/2013
日期时间 2 = 2013 年 11 月 12 日
输出:“一个月零一天”
我已经搜索过,没有找到关于那种解析器的任何东西。
在测量两个日期之间的时间间隔并将结果作为“1Y 2M 3D”形式的字符串给出时,自然的假设是使用 .NET TimeSpan 类。但是这个假设是不够的,因为 TimeSpan 只测量天、小时、分钟和秒,并且没有提供任何关于经过的月数的信息。或者几年。这意味着您必须深入研究日历才能知道特定月份有多少天等等。
可以用来解决问题的辅助方法是...
private static String Interval(DateTime start, DateTime end)
{
if (end <= start)
{
throw new Exception("Invalid interval");
}
int days = 0;
int months = 0;
int years = 0;
DateTime temp = start;
while (start.AddYears(years) <= end)
{
++years;
}
--years;
temp = temp.AddYears(years);
while (temp.AddMonths(months) <= end)
{
++months;
}
--months;
temp = temp.AddMonths(months);
while (temp.AddDays(days) <= end)
{
++days;
}
--days;
StringBuilder result = new StringBuilder();
if (years > 0)
{
result.AppendFormat("{0}Y ", years);
}
if (months > 0)
{
result.AppendFormat("{0}M ", months);
}
if (days > 0)
{
result.AppendFormat("{0}D", days);
}
return result.ToString();
}
此方法使用本机 .NET 方法在两个日期之间递增各种计数器,并避免使用日历。
它产生这些结果
Start 22 Oct 2013 End 28 Oct 2013 => 6D
Start 23 Aug 2013 End 28 Oct 2013 => 2M 5D
Start 1 Jan 2012 End 28 Oct 2013 => 1Y 9M 27D
等等...
您可以使用相同的技术将时间间隔解析为分钟和秒。您可以通过添加另一个变量并在其上循环来将数周引入该方法。
while (temp.AddDays(weeks*7) <= end)
{
++weeks;
}
--weeks;
temp = temp.AddDays(weeks*7);
我很抱歉格式不好,似乎代码格式化程序已经南下。
Triva:传奇人物 Jon Skeet 对同样的问题进行了破解,但随后写道,他没有时间完成答案。 如何获得年/月/周/日两个日期之间的差异?
您应该使用 TimeSpan 类型的对象,您可以通过从另一个中减去一个 DateTime 来获得该对象。
然后你只需要使用格式化输出字符串。
DateTime dateTime1 = new DateTime(2000, 01, 01, 0, 0, 0);
DateTime dateTime2 = new DateTime(2001, 02, 02, 10, 10, 10);
TimeSpan timeSpan1 = dateTime1 - dateTime2;
DateTime dateTime3 = new DateTime(timeSpan1.Ticks);
string string1 =
dateTime3.Day + " days" +
dateTime3.Month + " months" +
dateTime3.Year + " years";
在正确的轨道上,您仍然需要计算您真正想要的值,一周中的几天,每月的几天等。