J'essaie de garder une trace du nombre de repas qu'une personne a donné à partir de deux dates, vous pouvez entrer dans DateTimePickers.
Il y a trois repas par jour entre des heures spécifiques entre: p>
Si une personne arrive après l'une des périodes spécifiques, elles manquent un repas, alors par exemple si j'arrive le 1er janvier 2018 3h du matin et partir le 2 janvier 2018 14 heures, je ne recevrai que 5 repas, Comme je me suis manqué au dernier repas. P>
C'est le code que je suis arrivé, mais malheureusement, j'ai du mal à travailler le code si le temps entre les deux dates est plus d'un jour de distance. < / p>
3 Réponses :
Je trouve votre code assez difficile à mantiner (si vous souhaitez ajouter un quatrième repas à l'avenir, ce serait un cauchemar de changer votre code), donc je vous donne une approche différente, ainsi que de répondre Votre question.
Tout d'abord, je définirais une classe comme celle-ci: p> alors, je voudrais simplement instancier la classe et appeler les fonctions: p> void Main(string[] args)
{
CalculateMeals(new DateTime(2019, 1, 1, 15, 12, 1), new DateTime(2019, 1, 2, 18, 0, 0));
}
public static void CalculateMeals(DateTime timeArrived, DateTime timeExit)
{
// Number of full days
int fullDaysNumber = (timeExit - timeArrived).Days;
DayMeals dayMeals = new DayMeals(true);
for (int i = 0; i <= fullDaysNumber; i++)
{
int hoursDiff = (int)(timeExit - timeArrived).TotalHours;
if (timeExit.Day > timeArrived.Day && hoursDiff > 24)
{
dayMeals.AddFullDay();
// A trick to make the cycle work the next time
// You can use a different variable if you want to keep timeArrived unchanged
timeArrived = timeArrived.AddDays(1);
}
else if (timeExit.Day < timeArrived.Day)
{
break;
}
else
{
if (timeArrived.Day != timeExit.Day)
{
dayMeals.CountMealsForADay(timeArrived, new DateTime(1,1,timeArrived.Day,23,59,59));
dayMeals.CountMealsForADay(new DateTime(1,1,timeExit.Day,0,0,1), timeExit);
}
else
{
dayMeals.CountMealsForADay(timeArrived, timeExit);
}
}
}
dayMeals.PrintMealsCount();
}
Merci beaucoup pour le code Fabio, cependant, je semble rencontrer un problème où comme si l'heure d'arrivée est par exemple 7am, cela n'enregistre pas le premier repas. Il semble que je ne puisse pas choisir une date où l'heure est supérieure à celle de l'heure donnée
Vous avez raison, mais @aldert accepté la réponse ne fonctionne pas vraiment non plus. Essayez son code avec ces dates et il ne comptera pas le troisième repas au 1er janvier: DateTime TimearriVived = Nouvelle DateTime (2019, 1, 1, 15, 3, 1); DateTime Timeeexit = Nouvelle DateTime (2019, 1, 2, 7, 34, 1); Au fait, j'ai changé mon code pour le faire fonctionner correctement dans toutes les situations. Vous pouvez activer la variable BOOL "Counthalfmeales" si vous souhaitez compter un repas comme "Terminé", même si l'heure de sortie est entrée entre le repas ... s'il vous plaît faites le moi savoir.
Fabio, vous êtes correct à l'époque où j'ai accepté la réponse d'Aldert comme la solution que j'ai réalisée, elle n'a pas fonctionné et oublié de ne pas accepter la réponse. J'ai testé votre code nouvellement modifié et il semble fonctionner parfaitement merci!
Vous allez, sans boucler. J'ai simplifié plus loin en utilisant uniquement des objets C # standard. L'astuce consiste à compter les jours complets et à travailler avec TimesPans.
Merci Aldert, ce code fonctionne parfaitement l'apprécier.
Après avoir passé plus de temps à tester le code, il semble qu'il ne comptait pas les repas correctement pour les dates telles que le 5 janvier 2019 de 13h53 et le 6 janvier 2019 à 8h46. Je comprends cependant l'aide.
Je n'ai pas vérifié cela dans VS, mais quelque chose comme ça devrait fonctionner. J'ai copié votre code le même jour, en supposant également que c'est correct aussi:
public class MealCalculation
{
int countA, countB, countC = 0;
int total = 0;
public void Calculate()
{
var start = DateTime.Now;
var finish = DateTime.Now;
// Same Day
if (start.Date == finish.Date)
{
MealsCalculate(start.Hour, start.Hour);
}
// Next Day
else if (start.AddDays(1).Date == finish.Date)
{
MealsCalculate(start.Hour, 24);
MealsCalculate(0, finish.Hour);
}
// Great Than 1 Day
else
{
// First Day
MealsCalculate(start.Hour, 24);
// Middle Full Days
var days = NumberOfDays(start.Date, finish.Date);
countA += days;
countB += days;
countC += days;
// Finish Day
MealsCalculate(0, finish.Hour);
}
// Total
total = countA + countB + countC;
}
public int NumberOfDays(DateTime start, DateTime finish)
{
var days = 0;
while (start < finish)
{
start.AddDays(1);
days++;
}
return days - 1;
}
public void MealsCalculate(int totalHoursArrived, int totalHoursExit)
{
if (totalHoursArrived <= 8 && totalHoursExit >= 17) //if date is before or on 8AM and leaves on or after 5PM.
{
countA += 1;
countB += 1;
countC += 1;
}
else if (totalHoursArrived <= 8 && (totalHoursExit >= 12 && totalHoursExit < 17)) //if date is before or on 8AM and leaves before 5PM
{
countA += 1;
countB += 1;
}
else if (totalHoursArrived <= 8 && totalHoursExit < 12) //if date is before or on 8AM and leaves before 12PM
{
countA += 1;
}
else if ((totalHoursArrived <= 12 && totalHoursArrived > 8) && totalHoursExit >= 17) //if date is before or on 12PM and leaves on or after 5PM
{
countB += 1;
countC += 1;
}
else if ((totalHoursArrived <= 12 && totalHoursArrived > 8) && totalHoursExit < 17) //if date is before or on 12PM and leaves before 5PM
{
countB += 1;
}
else if (totalHoursArrived >= 17) //if date is after or on 5PM
{
countC += 1;
}
}
}
Trouvez le plus grand nombre de coins 24h / 24 que votre intervalle de date contient (
(int) totalhours / 24 code>). Ajouter ce numéro * 3 à la réponse. Soustrayez ce nombre * 24 heures à partir de la période initiale. Maintenant, vous êtes laissé avec une période de temps inférieure à 24 heures, que vous savez déjà comment gérer. Manipulez-le et ajoutez son résultat au précédent3 * x code>.@Gserg Je suis un peu confus sur la façon dont je devrais trouver le plus grand nombre de 24 heures, pouvez-vous peut-être me fournir un exemple?
(int) TOTALHOURS / 24 CODE>@Gserg Qu'est-ce que je voulais dire était si vous pouviez peut-être le donner dans un exemple que vous l'utiliseriez, car j'ai essayé de le faire comme si vous avez dit que vous avez dit que si je soustrayez "le nombre * 24" de l'épanouie (TimeExit - TimearriVived) t Déterminez alors quel contrevêtement compter car il ne renvoie que le nombre d'heures restantes.
Oui, il retourne le nombre d'heures restantes. Ces heures restantes commencent à
TimearRuivité Code>. Vous remplacez efficacementTimeeexit code> avecTimearriVived + (Timeeexit - TimearriVived) .Addhours (-X * 24) Code>.