c#日期比较返回DateTime对象

时间:2011-05-07 19:44:06

标签: c# datetime date

鉴于DateTime对象(上次购买),我可以与DateTime.Now进行比较,以返回包含年,月,日,小时和秒的新DateTime对象吗?

我可以比较日期并返回年数,但是我需要所有细节到第二个。

任何帮助或示例都将不胜感激

7 个答案:

答案 0 :(得分:2)

您不希望拥有新的DateTime对象。你想要的是TimeSpan。如果你减去DateTime个实例,那就是你得到的结果:

TimeSpan difference = DateTime.Now - yourDate

答案 1 :(得分:1)

不,你不能,因为DateTime代表一个绝对时间点,而不是一段时间。用于差异的正确对象是TimeSpan。它具有所有相关时间单位的属性。您可以通过减去两个DateTime来获得一个:

TimeSpan ts = DateTime.Now - purchaseDate;

答案 2 :(得分:0)

您可以使用TimeSpan比较两个日期。看看

DateTime date1 = new DateTime(2010, 1, 1, 8, 0, 15);
DateTime date2 = new DateTime(2010, 8, 18, 13, 30, 30);
// Calculate the interval between the two dates.
TimeSpan interval = date2 - date1;

年份和月份必须通过自定义编码计算,因为月份是一个可变的度量单位,但由于TimeSpan告诉您自己可以计算数月和数年的日期。

看看这个post

看看这个forum

希望得到这个帮助。

答案 3 :(得分:0)

TimeSpan是处理此问题的正确方法,但是,如果您不想自己进行数月/年的转换,您可以使用一些递归方法减去年数,直到达到正确的年份,直到你会到达正确的月份,直到你到达正确的一天,等等。但这会很糟糕,但是很难看。

此外,您需要一个可以保存数据的自定义对象。

粗略的剪切会像

DateTime original = [Whatever]
DateTime compare = [Whatever]
DateTimeDiff difference = GetDifference(original, compare)

GetDifference(DateTime original, DateTime compare)
{
  DateTimeDiff difference = new DateTimeDifference
  while(!original.Equals(compare) && original.Year >= compare.Year)
  {
     original.AddYears(-1);
     difference.Years++;
  }
  <snip...  //more code to do the same thing for months, days, hours, etc.)
}

就像我说的那样,它会很糟糕,但你可以这样做。

答案 4 :(得分:0)

This库包含 DateDiff 类,支持年份和月份:

// ----------------------------------------------------------------------
public void DateDiffSample()
{
  DateTime date1 = new DateTime( 2009, 11, 8, 7, 13, 59 );
  Console.WriteLine( "Date1: {0}", date1 );
  // > Date1: 08.11.2009 07:13:59
  DateTime date2 = new DateTime( 2011, 3, 20, 19, 55, 28 );
  Console.WriteLine( "Date2: {0}", date2 );
  // > Date2: 20.03.2011 19:55:28

  DateDiff dateDiff = new DateDiff( date1, date2 );

  // differences
  Console.WriteLine( "DateDiff.Years: {0}", dateDiff.Years );
  // > DateDiff.Years: 1
  Console.WriteLine( "DateDiff.Quarters: {0}", dateDiff.Quarters );
  // > DateDiff.Quarters: 5
  Console.WriteLine( "DateDiff.Months: {0}", dateDiff.Months );
  // > DateDiff.Months: 16
  Console.WriteLine( "DateDiff.Weeks: {0}", dateDiff.Weeks );
  // > DateDiff.Weeks: 70
  Console.WriteLine( "DateDiff.Days: {0}", dateDiff.Days );
  // > DateDiff.Days: 497
  Console.WriteLine( "DateDiff.Weekdays: {0}", dateDiff.Weekdays );
  // > DateDiff.Weekdays: 71
  Console.WriteLine( "DateDiff.Hours: {0}", dateDiff.Hours );
  // > DateDiff.Hours: 11940
  Console.WriteLine( "DateDiff.Minutes: {0}", dateDiff.Minutes );
  // > DateDiff.Minutes: 716441
  Console.WriteLine( "DateDiff.Seconds: {0}", dateDiff.Seconds );
  // > DateDiff.Seconds: 42986489
} // DateDiffSample

答案 5 :(得分:0)

如果你想要几年和几个月,你必须编写自己的代码。由于不同的飞跃问题,使用100%正确的输出编写此代码实际上很棘手。

以下是一些棘手的特殊情况(注意2012年是闰年,2011年不是):

  1. 2010年2月28日 2011年2月28日之间 - 1y,0m,0d
  2. 2011年2月28日 2012年2月28日之间 - 1y,11m,28d
  3. 2011年2月28日 2012年2月29日之间 - 1y,0m,0d
  4. 2012年2月29日 2013年2月28日之间 - 1y,0m,0d
  5. 2011年2月10日 2011年3月9日之间 - 0y,0m,27d
  6. 2012年2月10日 2012年3月9日之间 - 0y,0m,28d
  7. 我认为您需要通过一些修改来实现类似AllenG的算法

    1. 您需要从最早日期时间(datetime1)开始。确保它是最早的。
    2. 循环直到datetime1.AddYears(1)将大于或等于与最新的日期时间(datetime2)进行比较。确保比较整个日期时间而不仅仅是starttime和endttime的year属性。

      • 每次迭代增加一年计数器。
      • 实际上将一年添加到datetime1副本。
    3. 从datetime1副本开始(您已在步骤2中添加了多年)

    4. 循环直到datetime1.AddMonths(1)比较大于或等于您的最新日期时间(datetime2)。再次:确保比较整个日期时间而不仅仅是月份组件
      • 每次迭代增加一个月计数器。
      • 实际上会在datetime1副本中添加一个月。
    5. 等。等
    6. 此算法可确保您使用基础日历的右侧摘录计算年,月,日,小时,分钟和秒差异。

答案 6 :(得分:-1)

我认为您需要结合TimeSpan和一些自定义计算。这,因为您希望年份和月份具有可变长度。此外,您还需要小时数,分钟数和秒数。 我认为这种方法可以满足您的需求:

var date1 = new DateTime(2010, 1, 1, 8, 0, 15);
var date2 = new DateTime(2007, 8, 18, 13, 30, 30);

var differenceYears = date1.Year - date2.Year;
var tempDate = date2.AddYears(differenceYears);
var differenceMonths = date1.Month - tempDate.Month;
if (differenceMonths < 0)
{
    differenceMonths += 12;
    differenceYears--;
}
tempDate = date2.AddYears(differenceYears).AddMonths(differenceMonths);
var additionalTimeSpan = date1 - tempDate;
var differenceDays = additionalTimeSpan.Days;
var differenceHours = additionalTimeSpan.Hours;
var differenceMinutes = additionalTimeSpan.Minutes;
var differenceSeconds = additionalTimeSpan.Seconds;