2

我想计算两个日期之间的差异,并希望根据考虑到所有月份都是 30 天的差异将其转换为 2 年、5 个月或仅 3 个月或 2 天...

例如;

自(含):2009 年 3 月 12 日至(但不包括):2011 年 11 月 26 日

输出必须是:2 年 8 个月 14 天,不包括结束日期。

另一个例子;

开始时间:2010 年 1 月 26 日结束时间:2010 年 2 月 15 日

输出:从开始日期到结束日期的 20 天,但不包括结束日期

我可以用 Datediff 计算月、日或小时的差异,但问题是如何将其转换为年、月和日期。实际上这很复杂,因为我们不知道两个月之间有多少天(30,31 可能是 28 天)

我使用这个经典的 ASP 代码来转换差异,但有很多缺点。

Function Convert_Date_to_Text(tarih1,tarih2,useDates)

if (tarih1<>"" AND tarih2<>"") then
    if Tarih_Araligi_Belirle(tarih1,tarih2,"day")>0 then

        Date1_Year          = Year(tarih1) 
        Date1_Month         = Month(tarih1) 
        Date1_Day           = Day(tarih1)
        Date2_Year          = Year(tarih2)
        Date2_Month         = Month(tarih2)
        Date2_Day           = Day(tarih2)

        If (Date1_Month = 12) and (Date1_Day = 31) and 
                    (Date2_Month = 1) and (Date2_Day = 1) Then 
            NoOfyears       = Date2_Year - Date1_Year - 1 
            NoOfmonths      = 0
            NoOfdays        = 1
        Else 
            NoOfyears       = Date2_Year - Date1_Year 
            NoOfmonths      = Date2_Month - Date1_Month
            NoOfdays        = Date2_Day - Date1_Day 
        End If

        If NoOfyears = 1 Then 
            FormatString        = "1 year "
        Else If NoOfyears <= 0 then
            FormatString        = ""
        Else
            FormatString        = CStr(NoOfyears) & " years "
        End If:End If

        If NoOfmonths = 1 Then 
            FormatString        = FormatString & "1 month" 
        Else If NoOfmonths <= 0 then
            FormatString        = FormatString
        Else
            FormatString        = FormatString & CStr(NoOfmonths) & " months "
        End If:End If

        if useDates=1 then
            If NoOfdays = 1 Then 
                FormatString        = FormatString & "1 day" 
            Else If NoOfdays <= 0 Then
                FormatString        = FormatString
            Else     
                FormatString        = FormatString & CStr(NoOfdays) & " days"
            End If:End If
        end if

    end if  
end if

Convert_Date_to_Text        =   FormatString

     End Function

该网站完美地计算了差异。时间与日期网

注意:我使用 Classic ASP 有几个原因(公司限制)。抱歉,我需要一个 ASP 函数。看起来 ASP 中不存在 TimeSpan :(

亲切的问候

4

6 回答 6

2

如果您可以将输入字符串转换为DateTime变量,则可以尝试以下操作:

DateTime starTime = //something;
DateTime endTime = //something;
TimeSpan oneDay = new TimeSpan(1, 0, 0, 0); //creates a timespan of 1 day
TimeSpan deltaTime = (endTime - startTime) - oneDay;

我会假设 asp 有DateTimeTimeSpan变量类型。

于 2011-04-27T02:24:43.337 回答
1

这个怎么样?(没有 TimeSpan 但不确定是否兼容经典 asp)

DateTime dateTime1 = new DateTime(2003,2,2);
DateTime dateTime2 = new DateTime(2001,1,1);

int daysDiff = dateTime1.Day - dateTime2.Day;
int monthsDiff = dateTime1.Month - dateTime2.Month;
int yearsDiff = dateTime1.Year - dateTime2.Year;

if (daysDiff < 0)
{
    daysDiff += DateTime.DaysInMonth(dateTime1.Year, dateTime1.Month);
    monthsDiff--;
}

if (monthsDiff < 0)
{
    monthsDiff += 12;
    yearsDiff--;
}

Console.WriteLine(daysDiff);
Console.WriteLine(monthsDiff);
Console.WriteLine(yearsDiff);
于 2011-04-27T02:34:17.600 回答
1

这是我过去使用的一个功能。如果你测试它,我想你会发现它是准确的。这是我从那里得到的。

Function YearsMonthsDays(Date1 As Date, Date2 As Date, Optional ShowAll As _
    Boolean = False, Optional Grammar As Boolean = True)

     ' This function returns a string "X years, Y months, Z days" showing the time
     ' between two dates.  This function may be used in any VBA or VB project

     ' Date1 and Date2 must either be dates, or strings that can be implicitly
     ' converted to dates.  If these arguments have time portions, the time portions
     ' are ignored. If Date1 > Date2 (after ignoring time portions), the function
     ' returns an empty string

     ' ShowAll indicates whether all portions of the string "X years, Y months, Z days"
     ' are included in the output.  If ShowAll = True, all portions of the string are
     ' always included.  If ShowAll = False, then if the year portion is zero the year
     ' part of the string is omitted, and if the year portion and month portion are both
     ' zero, than both year and month portions are omitted.  The day portion is always
     ' included, and if at least one year has passed then the month portion is always
     ' included

     ' Grammar indicates whether to test years/months/days for singular or plural

     ' By definition, a "full month" means that the day number in Date2 is >= the day
     ' number in Date1, or Date1 and Date2 occur on the last days of their respective
     ' months. A "full year" means that 12 "full months" have passed.

     ' In Excel, this function is an alternative to the little-known DATEDIF.  DATEDIF
     ' usually works well, but can create strange results when a date is at month end.
     ' Thus, this formula:

     '       =DATEDIF(A1,B1,"y") & " years, " & DATEDIF(A1,B1,"ym") & " months, " &
     '       DATEDIF(A1,B1,"md") & " days"

     ' will return "0 years, 1 months, -2 days" for 31-Jan-2006 and 1-Mar-2006.
     ' This function will return "0 years, 1 month, 1 day"

    Dim TestYear As Long, TestMonth As Long, TestDay As Long
    Dim TargetDate As Date, Last1 As Date, Last2 As Date

     ' Strip time portions
    Date1 = Int(Date1)
    Date2 = Int(Date2)

     ' Test for invalid dates
    If Date1 > Date2 Then
        YearsMonthsDays = ""
        Exit Function
    End If

     ' Test for whether the calendar year is the same
    If Year(Date2) > Year(Date1) Then

         ' Different calendar year.

         ' Test to see if calendar month is the same.  If it is, we have to look at the
         ' day to see if a full year has passed
        If Month(Date2) = Month(Date1) Then
            If Day(Date2) >= Day(Date1) Then
                TestYear = DateDiff("yyyy", Date1, Date2)
            Else
                TestYear = DateDiff("yyyy", Date1, Date2) - 1
            End If

             ' In this case, a full year has definitely passed
        ElseIf Month(Date2) > Month(Date1) Then
            TestYear = DateDiff("yyyy", Date1, Date2)

             ' A full year has not passed
        Else
            TestYear = DateDiff("yyyy", Date1, Date2) - 1
        End If

         ' Calendar year is the same, so a full year has not passed
    Else
        TestYear = 0
    End If

     ' Test to see how many full months have passed, in excess of the number of full
     ' years
    TestMonth = (DateDiff("m", DateSerial(Year(Date1), Month(Date1), 1), _
    DateSerial(Year(Date2), Month(Date2), 1)) + IIf(Day(Date2) >= _
    Day(Date1), 0, -1)) Mod 12

     ' See how many days have passed, in excess of the number of full months.  If the day
     ' number for Date2 is >= that for Date1, it's simple
    If Day(Date2) >= Day(Date1) Then
        TestDay = Day(Date2) - Day(Date1)

         ' If not, we have to test for end of the month
    Else
        Last1 = DateSerial(Year(Date2), Month(Date2), 0)
        Last2 = DateSerial(Year(Date2), Month(Date2) + 1, 0)
        TargetDate = DateSerial(Year(Date2), Month(Date2) - 1, Day(Date1))
        If Last2 = Date2 Then
            If TestMonth = 11 Then
                TestMonth = 0
                TestYear = TestYear + 1
            Else
                TestMonth = TestMonth + 1
            End If
        Else
            TestDay = DateDiff("d", IIf(TargetDate > Last1, Last1, TargetDate), Date2)
        End If
    End If

    If ShowAll Or TestYear >= 1 Then
        YearsMonthsDays = TestYear & IIf(TestYear = 1 And Grammar, " year, ", _
        " years, ") & TestMonth & IIf(TestMonth = 1 And Grammar, " month, ", _
        " months, ") & TestDay & IIf(TestDay = 1 And Grammar, " day", " days")
    Else
        If TestMonth >= 1 Then
            YearsMonthsDays = TestMonth & IIf(TestMonth = 1 And Grammar, " month, ", _
            " months, ") & TestDay & IIf(TestDay = 1 And Grammar, " day", " days")
        Else
            YearsMonthsDays = TestDay & IIf(TestDay = 1 And Grammar, " day", " days")
        End If
    End If

End Function
于 2013-06-24T21:33:18.323 回答
0

您可以减去DateTime对象以获得TimeSpan对象:

DateTime startDate = GetStartDate();
DateTime endDate = GetEndDate();
TimeSpan duration = endDate - startDate;
于 2011-04-27T02:26:15.680 回答
0

本文包含一个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

  // elapsed
  Console.WriteLine( "DateDiff.ElapsedYears: {0}", dateDiff.ElapsedYears );
  // > DateDiff.ElapsedYears: 1
  Console.WriteLine( "DateDiff.ElapsedMonths: {0}", dateDiff.ElapsedMonths );
  // > DateDiff.ElapsedMonths: 4
  Console.WriteLine( "DateDiff.ElapsedDays: {0}", dateDiff.ElapsedDays );
  // > DateDiff.ElapsedDays: 12
  Console.WriteLine( "DateDiff.ElapsedHours: {0}", dateDiff.ElapsedHours );
  // > DateDiff.ElapsedHours: 12
  Console.WriteLine( "DateDiff.ElapsedMinutes: {0}", dateDiff.ElapsedMinutes );
  // > DateDiff.ElapsedMinutes: 41
  Console.WriteLine( "DateDiff.ElapsedSeconds: {0}", dateDiff.ElapsedSeconds );
  // > DateDiff.ElapsedSeconds: 29

  // description
  Console.WriteLine( "DateDiff.GetDescription(1): {0}", dateDiff.GetDescription( 1 ) );
  // > DateDiff.GetDescription(1): 1 Year
  Console.WriteLine( "DateDiff.GetDescription(2): {0}", dateDiff.GetDescription( 2 ) );
  // > DateDiff.GetDescription(2): 1 Year 4 Months
  Console.WriteLine( "DateDiff.GetDescription(3): {0}", dateDiff.GetDescription( 3 ) );
  // > DateDiff.GetDescription(3): 1 Year 4 Months 12 Days
  Console.WriteLine( "DateDiff.GetDescription(4): {0}", dateDiff.GetDescription( 4 ) );
  // > DateDiff.GetDescription(4): 1 Year 4 Months 12 Days 12 Hours
  Console.WriteLine( "DateDiff.GetDescription(5): {0}", dateDiff.GetDescription( 5 ) );
  // > DateDiff.GetDescription(5): 1 Year 4 Months 12 Days 12 Hours 41 Mins
  Console.WriteLine( "DateDiff.GetDescription(6): {0}", dateDiff.GetDescription( 6 ) );
  // > DateDiff.GetDescription(6): 1 Year 4 Months 12 Days 12 Hours 41 Mins 29 Secs
} // DateDiffSample
于 2011-04-27T06:50:59.780 回答
0

Dim intYears
Dim intMonths
Dim intDays

Dim strDate1
Dim strDate2

Dim strAnswer

strDate1 = "01/26/2010"
strDate2 = "02/15/2010"

intYears  = DateDiff("yyyy",strDate1,strDate2)
intMonths = DateDiff("m",strDate1,strDate2)
intDays   = DateDiff("d",strDate1,strDate2)

strAnswer = ""
if intYears > 0 then 
  strAnswer = strAnswer &  CStr(intYears) & "years "
end if
if intMonths > 0 then 
  strAnswer = strAnswer &  CStr(intMonths) & "months"
end if
if intDays > 0 then 
  strAnswer = strAnswer &  CStr(intDays) & "days"
end if

Response.Write("The difference between these two dates is " & strAnswer)
于 2011-05-12T18:14:31.150 回答