Test NUnit DateTime sans fonction .Net Timespan ou DateTime
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;
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;
}
}