鉴于DateTime对象(上次购买),我可以与DateTime.Now进行比较,以返回包含年,月,日,小时和秒的新DateTime对象吗?
我可以比较日期并返回年数,但是我需要所有细节到第二个。
任何帮助或示例都将不胜感激
答案 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年不是):
我认为您需要通过一些修改来实现类似AllenG的算法
循环直到datetime1.AddYears(1)将大于或等于与最新的日期时间(datetime2)进行比较。确保比较整个日期时间而不仅仅是starttime和endttime的year属性。
从datetime1副本开始(您已在步骤2中添加了多年)
此算法可确保您使用基础日历的右侧摘录计算年,月,日,小时,分钟和秒差异。
答案 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;