NUnit DateTime test without function. Times Timespan or DateTime

What is an optimized C # version of the following, without using .Net Timespan or DateTime. How would I NUnit test this?

TimeSpan ts = Date1 - Date2;
int numberOfDays = ts.Days;

      

0


source to share


3 answers


You can convert dates to ticks, subtract and then convert ticks back to days. Although exactly why can't you use TimeSpan? Probably so.

Something like that:



      DateTime a = DateTime.Now;
      DateTime b = a.AddDays(2);

      // ticks are in hns
      long ticks = b.Ticks - a.Ticks;
      long seconds = ticks / 10000000;
      long minutes = seconds / 60;
      long hours = minutes / 60;
      long days = hours / 24;

      

I am going back to "2" for a few days.

0


source


Date1 and Date2 - what type? In your exameple, it looks like DateTime. Do you need your date in what variable if it's not a DateTime? You can always have Date1 and Date2 in String and play with SubString () to get Year, Month and Days, but that would be a real pain to work with.

Optimized way to solve your problem:

TimeSpan ts = Date1 - Date2;
int numberOfDays = ts.Days;

      



there is

DateTime Date1 = new DateTime(2008,12,01);
DateTime Date2 = new DateTime(2008,12,25);
int numberOfDayBetweenDateThatShouldBe = 25;
Assert.IsTrue((Date2-Date1).TotalDays == numberOfDayBetweenDateThatShouldBe);

      

0


source


thanks, this is homework (asp.net)

The challenge is to write an asp.net application in C # that takes 2 dates as input from the user, prints the number of days in between, and displays that number back to the user. This should not be used by any of the built-in .net Framework DateTime or TimeSpan classes.

and alas my most elegant implementation on performance

private int CalculateDays(DateTime start, DateTime end )
{
   DateTime origin = new DateTime(); 
   return (end - origin).Days - (start - origin).Days;
}

protected void Button1_Click(object sender, EventArgs e)
{
    // Parse dates for correctness and range errors, warn as necessary
    DateTime start;
    DateTime end;

    // rough error implement error handling implementation   
    string errors = string.Empty;

         if(!DateTime.TryParse(txt_start_date.Text.Trim(), out start))   errors+="Start date was incorrect";
    else if(!DateTime.TryParse(txt_end_date.Text.Trim(), out end))   errors+= (errors.Length>0? errors+= "\n":"") + "End date was incorrect" ; 
    else if ((end.Day - start.Day) <= 0) errors+= (errors.Length>0? errors+= "\n":"" ) + "End date must be greater than the Start date" ;         //CultureInfo.InvariantCulture
    else 
    {
        Response.Write(CalculateDays(start, end)); 
    }
    Debug.Assert(errors.Length <= 0, errors); 
}

      

Reason for not being able to see how to do this without touching DateTime.Days at least.


edit well thought again and a little monkey, however, don't use DateTime or Timespan anywhere

public static class PrimitiveCal
{
    // incremental total days a normal year 
    private static int[] DaysInYr = new int[] {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 };

    // incremental total days in a leap year 
    private static int[] DaysInLeapYr = new int[] { 0,31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 };


    public static long GetDays(int[] dt_start, int[] dt_end)
    {

        int day_diff = dt_end[0] - dt_start[0];
        int s_mth = dt_start[1];
        int e_mth = dt_end[1];
        int s_year = dt_start[2];
        int e_year = dt_end[2];
        int yr_diff = e_year - s_year;

        return day_diff + (yr_diff > 0 ?
                         // use months as boundaries, cater for leap years
                         (YrType(e_year)[e_mth - 1] +
                         (YrType(s_year)[YrType(s_year).Length - 1] - YrType(s_year)[s_mth - 1])) +
                         (yr_diff == 1 ? 0 : AddMiddleYears(s_year, e_year))

                         // get month sums in same year 
                         : YrType(e_year)[e_mth - 1] - YrType(e_year)[s_mth - 1]);
    }

    private static int AddMiddleYears(int s_year, int e_year)
    {
        int total_days = 0;
        for (int i = s_year + 1; i <= e_year - 1; i++) total_days += YrType(i)[YrType(i).Length - 1];
        return total_days;
    }

    private static int[] YrType(int year)
    {
        return (year % 4  == 0 &&  year%100!=0) || year % 400 ==0 ? DaysInLeapYr : DaysInYr;
    }
}

      


0


source







All Articles