Question

Quelle est la version optimisée pour C # de ce qui suit, sans utiliser Timespan ou DateTime .Net. Comment pourrais-je le tester?

TimeSpan ts = Date1 - Date2;
int numberOfDays = ts.Days;
Était-ce utile?

La solution

Vous pouvez convertir les dates en ticks, soustraire, puis reconvertir les ticks en jours. Mais pourquoi ne pas utiliser TimeSpan? C'est probablement ce qui se passe.

Quelque chose comme ça:

      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;

Je récupère "2". pendant des jours.

Autres conseils

Quels sont les types Date1 et Date2? Dans votre exemple, il semble que ce soit DateTime. Vous voulez que votre Date soit dans quelle variable si ce n'est pas DateTime? Vous pouvez toujours avoir vos Date1 et Date2 dans String et jouer avec SubString () pour obtenir l'année, le mois et les jours, mais ce serait très pénible de travailler avec.

La manière optimisée de résoudre votre problème de:

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

est

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

merci, c'est un devoir (asp.net)

La tâche consiste à écrire une application asp.net en c # prenant deux dates comme entrée de l'utilisateur, calcule le nombre de jours entre elles et affiche ce nombre à l'utilisateur. Cela ne doit utiliser aucune des classes DateTime ou TimeSpan du cadre .net intégré.

et hélas ma mise en œuvre la plus élégante au niveau de la production

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

Raison étant incapable de voir comment faire cela sans toucher au moins à DateTime.Days.

modifier d'accord réfléchi encore et un peu de travail de singe, cependant, aucune utilisation de DateTime ou Timespan n'importe où

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;
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top