J'ai une méthode C # comme ceci:
public static int DaysLeft(DateTime startDate, DateTime endDate, Boolean excludeWeekends, String excludeDates)
{
}
7 Réponses :
La bibliothèque sucre subsonique a beaucoup d'aide pour gérer la manipulation de DateTime. P>
Vous pouvez trouver une liste complète sur le site site subsonique et le code source est dans Github . P>
Oh, c'est vraiment facile de boucler à travers les dates - ce n'est pas un problème du tout: Vous pouvez facilement écrire un J'essayerais d'éviter de faire String em> les opérations ici si possible mais fondamentalement, ces dates ne sont pas des cordes, donc si vous le pouvez Travaillez dans le domaine du problème aussi loin que possible, cela facilitera les choses. P> Bien sûr, il pourrait bien y avoir des moyens plus efficaces que de boucler, mais ils seront plus difficiles à obtenir. Si la boucle va bien en termes de performance, je m'engendrais à cela. P> comme une prise rapide pour mon propre projet open source, Time noda a un ensemble de types plutôt plus diversifiés représentant les dates et les heures - dans ce cas, vous utiliseriez EDIT: Si vous DO EM> Besoin de boucler des dates fréquemment, vous voudrez peut-être vouloir Quelque chose comme cette méthode d'extension (mettez-le dans une classe statique non générique de haut niveau): p> alors: p> ienumerable foreach code>. p> localDate code>. De cette façon, vous n'avez pas à vous soucier de ce qui se passe si le temps de "start" est plus tard que le temps de "fin", etc. D'autre part, le temps de noda n'est pas vraiment fini ... Les bits dont vous avez besoin. car cela est prêt et devrait fonctionner correctement, mais il est possible que l'API puisse toujours changer à l'avenir. p>
Pour éviter la comparaison des chaînes pour l'exclusion des dates, tout ce que vous avez à faire est de trouver le nombre de dates que vous excluez (en supposant qu'il n'y ait pas de week-end) que vous pouvez découvrir avec: exclludedates.split (','). Longueur. Puis soustrayez cela du nombre de jours.
Les dates d'exclusion ne sont peut-être pas nécessairement obstruées dans les dates de début et de fin, il faut donc un chèque ici - qui fait partie de la difficulté et des moyens que je ne peux pas le faire comme vous le suggérez.
Voici pseudocode pour une approche différente que j'ai utilisée dans SQL: p>
Voici un exemple qui comprend les dates, les week-ends et la boucle exclus. J'ai changé la chaîne exclore cependant une liste. Une vérification nulle doit être ajoutée.
public static int DaysLeft(DateTime startDate, DateTime endDate, Boolean excludeWeekends, List<DateTime> excludeDates)
{
int count = 0;
for (DateTime index = startDate; index < endDate; index = index.AddDays(1))
{
if (excludeWeekends && index.DayOfWeek != DayOfWeek.Sunday && index.DayOfWeek != DayOfWeek.Saturday)
{
bool excluded = false; ;
for (int i = 0; i < excludeDates.Count; i++)
{
if (index.Date.CompareTo(excludeDates[i].Date) == 0)
{
excluded = true;
break;
}
}
if (!excluded)
{
count++;
}
}
}
return count;
}
Au lieu de faire une boucle pour (int i = 0; i exclludeates.contents (index) code> et Ensuite, le code entier pourrait être simplifié à seulement 2 lignes si (exclutwekends && index.dayofeek! = Dayofweek.sunday && Index.dayofeek! = Dayofweek.Saturday &&! Exclusedats.Contains (index)) Comptez ++; Code>
Ceci pourrait fonctionner et éviter une solution de type O (N):
public int DaysLeft(DateTime startDate, DateTime endDate, Boolean excludeWeekends, String excludeDates)
{
//Work out days in range
int days = (int)endDate.Subtract(startDate).TotalDays + 1;
if (excludeWeekends)
{
//Remove most weekends by removing 2 in 7 days (rounded down)
days -= ((int)Math.Floor((decimal)(days / 7)) * 2);
if (startDate.DayOfWeek == DayOfWeek.Sunday) days -= 1;
if (startDate.DayOfWeek == DayOfWeek.Saturday) days -= 2;
}
return days;
}
combiner avec des expressions LINQ,
public int GetNoOfLeaveDays(DateTime fromDate, DateTime toDate, Boolean excludeWeekends, List<DateTime> excludeDates)
{
var count = 0;
for (DateTime index = fromDate; index <= toDate; index = index.AddDays(1))
{
if (!excludeWeekends || index.DayOfWeek == DayOfWeek.Saturday || index.DayOfWeek == DayOfWeek.Sunday) continue;
var excluded = excludeDates.Any(t => index.Date.CompareTo(t.Date) == 0);
if (!excluded) count++;
}
return count;
}
private int workingdays(int month,int year)
{
int daysInMonth = 0;
int days = DateTime.DaysInMonth(year, month);
for (int i = 1; i <= days; i++)
{
DateTime day = new DateTime(year, month, i);
if (day.DayOfWeek != DayOfWeek.Sunday && day.DayOfWeek != DayOfWeek.Saturday)
{
daysInMonth++;
}
}
return daysInMonth;
}
Une meilleure solution O (1) peut être trouvée ici: Stackoverflow.com/Questtions/1044688