如何从另一个日期中减去一个日期? [复制]
Posted
技术标签:
【中文标题】如何从另一个日期中减去一个日期? [复制]【英文标题】:How can I subtract one date from another? [duplicate] 【发布时间】:2013-08-12 12:22:46 【问题描述】:假设我有两个日期:
现在日期:#8/10/2013 10:53:46 PM#
第二个日期是文件创建日期:
#7/10/2011 9:57:58 PM#
我想做类似的事情:Date.Now - FileDate
。
这是我的代码:
Dim ddd As TimeSpan = Date.Now - SecondDate
时间跨度中没有“年份”属性。
(Year 属性应该是 2
2013 - 2011 = 2
,但是有一个 days 属性 - 但我必须得到年/秒和月/秒)
更新:
谢谢大家,但我创建了一个函数:
Public Class Timee
Private _Days As Integer
Public Property Days() As Integer
Get
Return _Days
End Get
Set(ByVal value As Integer)
_Days = value
End Set
End Property
Private _Months As Integer
Public Property Months() As Integer
Get
Return _Months
End Get
Set(ByVal value As Integer)
_Months = value
End Set
End Property
Private _Years As Integer
Public Property Years() As Integer
Get
Return _Years
End Get
Set(ByVal value As Integer)
_Years = value
End Set
End Property
End Class
Public Function GetTimeBetween(ByVal datee As Date, ByVal datee2 As Date) As Timee
Dim tt As TimeSpan = datee - datee2
Dim dd11 As Integer = tt.Days
Dim bb1 As Integer
Dim Month As Integer
Dim Years1 As Integer
Do Until dd11 <= 0
bb1 = dd11
dd11 = dd11 - 365
Years1 = Years1 + 1
Loop
Years1 = Years1 - 1
Dim Dayss As Integer
Do Until bb1 <= 0
Dayss = bb1
bb1 = bb1 - 30
Month = Month + 1
Loop
Dim tt1 As New Timee
tt1.Days = Dayss
tt1.Months = Month
IF Years1 < 0 Then
Years1 = 0
End IF
tt1.Years = Years1
Return tt1
End Function
希望它对某人有所帮助。
【问题讨论】:
如果没有约会,一年有多长?这是一个毫无意义的衡量标准,根据定义不能准确。与月份相同。 请确定 365 天是否为一年或更短,超过了可以回答的范围。 根据问题,您希望 31-12-2012 和 1-1-2013 之间的差异为 -30 天、-11 个月、+1 年。那看起来不对。你确定要这样而不是仅仅 +1 天吗? 看所描述的问题,我会说一年的准确性是过度思考。如果要查看文件的年龄,粗略的几年指南就足够了。 (显然有很多场景也需要高精度) 您可以完全忽略 TimeSpan 并计算两个日期的差异:techbrij.com/… 【参考方案1】:您可以使用 DateTime.Parse("date as a string") 将两者都转换为 DateTime 对象。 然后你会想要使用 DateTime.Subtract http://msdn.microsoft.com/en-us/library/8ysw4sby.aspx 然后你将拥有你想要的时间跨度,你可以在这里探索:http://msdn.microsoft.com/en-us/library/system.timespan_methods.aspx TotalDays 属性可以除以 365 以获得年份(请注意下面对此的公平挑战)。 几个月的计算会更复杂。
【讨论】:
闰年呢? 公平点。我会说,同样地,您将需要几个月的时间来决定所需的准确性。在某些情况下,365 和 30 是可以接受的。在其他情况下,您需要考虑所有细节。【参考方案2】:C#代码:
DateTime secondDate = ...;
var ddd = DateTime.Now - secondDate;
var days = ddd.TotalDays;
您无法获得“年”或“月”,因为并非所有年或月都具有相同的天数。
替代方案:
var now = DateTime.Now;
var totalYears = now.Year - secondDate.Year;
if (secondDate.Month > now.Month || (secondDate.Month == now.Month && secondDate.Day > now.Day))
totalYears--;
var months = now.Month - secondDate.Mont;
if (secondDate.Day > now.Day)
months--;
if (months < 0)
months = 12 + months;
【讨论】:
【参考方案3】:Dim ddd As New DateTime((Date.Now - SecondDate).Ticks)
另外,Jon Skeet 的 Noda Time 库中有一个函数。
【讨论】:
【参考方案4】:问题是没有真正通用的一年定义。在日历中,一年是 365 或 366 天。在银行业,一年是 360 天,等等。
根据您的代码,我想说您想要日历年份的差异,因此您不能从时间跨度中做到这一点(因为时间跨度不知道一年是 365 天还是 366 天)。
所以你可以这样做:
var years = DateTime.Now.Year - fileDate.Year;
var dayInCurrentYear = fileDate.AddYears(years);
//if the day is later in the year than today's day go back one year
if(dayInCurrentYear > DateTime.Now)
years--;
dayInCurrentYear = dayInCurrentYear.AddYears(-1);
var span = DateTime.Now - dayInCurrentYear;
Console.WriteLine("File was created 0 years and 1 days ago", years, span.TotalDays);
【讨论】:
【参考方案5】:TimeSpan
没有年份,因为TimeSpan
结构很简单,而且年份取决于文化以及起点和终点。这应该有效:
Dim zeroTime As New DateTime(1, 1, 1)
Dim a = #8/10/2013 10:53:46 PM#
Dim b = #7/10/2011 9:57:58 PM#
Dim span As TimeSpan = a - b
Dim years As Integer = (zeroTime + span).Year - 1
您还可以查看支持该功能的 Jon Skeet 的 Noda-Time。
【讨论】:
或者你可以使用 Ticks。 @It'sNotALie.: 但 OP 要求的不是滴答声。 我的意思是使用带刻度的 DateTime 构造函数和 Timespan 的刻度属性。以上是关于如何从另一个日期中减去一个日期? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
java - 如何从Java中存储日期的给定字符串字段中减去X天? [复制]