Datetime 如何计算两个不同的日期,如2年,5个月

Datetime 如何计算两个不同的日期,如2年,5个月,datetime,asp-classic,datediff,Datetime,Asp Classic,Datediff,我想计算两个日期之间的差异,并希望将其转换为2年、5个月或仅3个月,或根据差异转换为2天,考虑到所有月份都是30天 比如, 起止日期:2009年3月12日 至但不包括:2011年11月26日 输出必须为:2年8个月14天,不包括结束日期 另一个例子 开始日期:2010年1月26日 完二零一零年二月十五日 输出:从开始日期到结束日期的20天,但不包括结束日期 我可以用Datediff计算月、日或小时的差值,但问题是如何将其转换为年、月和日期。事实上,这相当复杂,因为我们不知道两个月之间有多少天(3

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

比如,

起止日期:2009年3月12日 至但不包括:2011年11月26日

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

另一个例子

开始日期:2010年1月26日 完二零一零年二月十五日

输出:从开始日期到结束日期的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
函数将日期转换为文本(tarih1、tarih2、useDates)
如果(tarih1”和tarih2“),则
如果Tarih_Araligi_Belille(tarih1,tarih2,“day”)>0,则
Date1_Year=年份(tarih1)
Date1_Month=月份(tarih1)
Date1_Day=天(tarih1)
Date2_Year=年份(tarih2)
Date2_Month=月份(tarih2)
Date2_Day=天(tarih2)
如果(日期1月=12)和(日期1日=31)和
(日期2月=1)和(日期2日=1)然后
NoOfyears=日期2年-日期1年-1
NoOfmonths=0
中午=1
其他的
Noofyear=日期2年-日期1年
NoOfmonths=日期2个月-日期1个月
NoOfdays=日期2天-日期1天
如果结束
如果NoOfyears=1,则
FormatString=“1年”

否则,如果NoOfyears如果可以将输入字符串转换为
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具有
DateTime
TimeSpan
变量类型。

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

DateTime startDate = GetStartDate();
DateTime endDate = GetEndDate();
TimeSpan duration = endDate - startDate;
这个怎么样?(无时间跨度,但不确定经典asp是否兼容)

DateTime dateTime1=新的DateTime(2003,2,2);
DateTime dateTime2=新的日期时间(2001,1,1);
int daysDiff=dateTime1.Day-dateTime2.Day;
int monthsDiff=dateTime1.Month-dateTime2.Month;
int yearsDiff=dateTime1.Year-dateTime2.Year;
如果(daysDiff<0)
{
daysDiff+=DateTime.DaysInMonth(dateTime1.Year,dateTime1.Month);
蒙斯迪夫--;
}
如果(月差<0)
{
月差+=12;
年月日--;
}
控制台写入线(daysDiff);
控制台。WriteLine(monthsDiff);
控制台写入线(年月日);
这包括一个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

这是我过去使用过的一个函数。如果你测试一下,我想你会发现它是准确的


我进行了快速搜索,但我认为ASP没有像TimeSpan这样的内置类。这是我找到的函数:但它不会将其转换为月或年。感谢您的回答,但asp不兼容。我想,很抱歉,我需要一个asp函数。如果是经典asp,请不要添加
asp.net
标记-它们有很大的不同。这就是为什么你用TimeSpan得到了所有答案…@slugster:谢谢你的警告。我编辑了标签。经典ASP日期时间函数可以在这里找到。您的答案对于ASP.NET是正确的,但是OP已经修改了他们的问题,限制为经典ASP。。。。
// ----------------------------------------------------------------------
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

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)
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