如何从另一个日期中减去一个日期? [复制]

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天? [复制]

熊猫:减去两个日期列,结果是一个整数

如何从python中的日期时间索引中减去半秒? [复制]

我可以使用 Swing TextField 在 Java 中进行日期数学运算吗?

当每周按一次按钮从另一张表导入日期时,如何在列中自动填充日期?