Je cherchais Stackoverflow pour trouver la question exacte du match et la réponse sur un problème similaire à résoudre en C #.
Bien que j'ai trouvé des similitudes sur les questions disponibles, je ne trouverais aucune question et réponse particulières sur la façon de calculer La SLA en jours, heures et minutes en C # excluant les jours fériés, les week-ends et les heures de travail non ouvrière. P>
Par exemple, j'ai le billet a été redatetime au 21/02/2019 10:00:00 Et si je voudrais ajouter seulement N (disons 21 dans cet exemple) Nombre d'heures de travail excluant les heures de travail, les week-ends et les jours fériés de travail pour trouver le Date SLA DateTime de ce billet en C #. P>
si je ' VE Certaines logiques mises en œuvre sur calculer uniquement les heures de travail, les week-ends, mais il est difficile d'exclure les jours fériés. Appréciez également la meilleure façon de faire la meilleure, simple et compréhensible (à l'aide de Linq probablement) que de longues lignes de fonctions. Apprécier tout exemple de code de la communauté. P>
J'ai une solution de travail affinée à partir d'un autre lien Stackoverflow comme ci-dessous, mais cela nécessite plus de raffinement pour simplifier et résoudre toutes les possibilités de bugs comme ce scénario ne manipulait pas. Si nous obtenons 2 jours de vacances continuellement, calculez la SLA du 3ème jour, etc. P>
La solution que j'ai jusqu'à présent est la suivante: p>
3 Réponses :
J'ai effectivement passé la dernière heure à mettre en œuvre cette solution qui combine un aswner à partir d'une autre question Stackoverflow ( Ajouter des heures à DateTime mais exclure les week-ends et doit être entre heures de travail ) qui calcule à une date des heures de travail + une pépite qui valide si une date ses vacances en fonction du pays spécifié.
D'abord installer le nugget puis j'ai créé 3 méthodes pour rendre votre fonctionnalité mais sa simple et vous pouvez l'optimiser à prendre à code cound et combien d'heures se trouvent dans une journée de travail et quand commence-t-il. , mais je l'ai fait codé dur juste par exemple des objectifs: p> ce que j'ai mis en œuvre sont 3 méthodes: addwithinworkinghours C'est la méthode principale que comme toutes les fonctionnalités de base et a été faite par L'utilisateur sur ce lien que j'ai mentionné (allez lui donner le crédit aussi) Il faut fondamentalement dans une date d'heure de début de la date de début (dans votre exemple le temps de billet de billet) et une tempute que vous pouvez passer du nombre d'heures de travail. Ensuite, les 2 prochaines méthodes sont celles qui prennent dans le compte des jours fériés, comme vous pouvez le remarquer dans cet exemple, j'ai utilisé des vacances portugaises, mais vous pouvez utiliser tout autre code de pays pris en charge par le package Nuge.Date Nuge. P> J'espère que ça vous aide vraiment! C'était un défi amusant pour moi mais utile pour les futures implémentations :) p> p>
Merci pour vos efforts et votre aide. En fait, j'ai la même solution de l'autre lien Stackoverflow avec un raffinement, car cela n'a pas exclué les jours fériés. Je travaille avec vos vacances excluant la solution intégrée à ma logique d'entreprise. Vous recherchez également toutes les possibilités de simplification et de test unitaire avec des options de date différentes.
Ceci est une tâche susceptible d'erreur dans mon expérience. Si vous travailliez dans des heures entières ou des jours, je suggérerais d'énumérer à travers chacun et de garder un total de qualifications.
Cependant, si vous avez besoin de précision minute, mieux utiliser une bibliothèque. P>
La bibliothèque référencée Dans l'une des réponses que les liens de Tiago semblent faire exactement ce que vous voulez: p>
https://www.codeproject.com/articles/1686662/time-Period-library-for-net p>
public void CalendarDateAddSample()
{
CalendarDateAdd calendarDateAdd = new CalendarDateAdd();
// weekdays
calendarDateAdd.AddWorkingWeekDays();
// holidays
calendarDateAdd.ExcludePeriods.Add( new Day( 2011, 4, 5, calendarDateAdd.Calendar ) );
// working hours
calendarDateAdd.WorkingHours.Add( new HourRange( new Time( 08, 30 ), new Time( 12 ) ) );
calendarDateAdd.WorkingHours.Add( new HourRange( new Time( 13, 30 ), new Time( 18 ) ) );
DateTime start = new DateTime( 2011, 4, 1, 9, 0, 0 );
TimeSpan offset = new TimeSpan( 22, 0, 0 ); // 22 hours
DateTime? end = calendarDateAdd.Add( start, offset );
Console.WriteLine( "start: {0}", start );
// > start: 01.04.2011 09:00:00
Console.WriteLine( "offset: {0}", offset );
// > offset: 22:00:00
Console.WriteLine( "end: {0}", end );
// > end: 06.04.2011 16:30:00
}
Merci Christian, je rafilisais la solution que j'ai. Regardera dans cette bibliothèque être utile.
Voici ma solution pour calculer les SLA. Plus facile à lire que certains sur-complexes que j'ai vus. Le code doit toujours être facilement maintenu par quelqu'un d'autre.
Il compte seulement le temps dans les heures de travail (les valeurs de début et de fin de journée de travail sont stockées dans DB et donc configurables). Il tiendra compte du samedi et du dimanche et des jours fériés publics (à partir d'une liste mises en cache en mémoire). P>
public static class DatetimeExtensionMethod
{
public static TimeSpan LocalTimeSpanToUTC(this TimeSpan ts)
{
DateTime dt = DateTime.Now.Date.Add(ts);
DateTime dtUtc = dt.ToUniversalTime();
TimeSpan tsUtc = dtUtc.TimeOfDay;
return tsUtc;
}
public static TimeSpan UTCTimeSpanToLocal(this TimeSpan tsUtc)
{
DateTime dtUtc = DateTime.UtcNow.Date.Add(tsUtc);
DateTime dt = dtUtc.ToLocalTime();
TimeSpan ts = dt.TimeOfDay;
return ts;
}
}
Comme le code de nettoyage avec la conversion UTC .. Merci :)
Avoir du mal à convertir ce code en Java, quel est l'équivalent de l'équivalent ici
Avez-vous une source de données pour les jours fériés pour commencer?
Oui. J'ai peu d'options I.e. Table de vacances avec dates de vacances et description saisies par l'utilisateur. L'option 2 est que pour recevoir les vacances JSON d'API de vacances publiques avec le pays spécifique et le stocker dans notre système pour calculer cette logique. Pour être spécifique, la table de vacances de base sera comme ID, date, nom.
Je ne comprends pas pourquoi certaines personnes votent à cette question? Serait de bons que ces personnes peuvent laisser quelques commentaires sur la raison pour laquelle le vote. Merci
Peut-être que parce que vous avez apporté une question aussi large qui implique une réponse plus détaillée et que vous indiquez que vous n'avez fait aucun effort dans le problème en montrant des exemples de la manière dont vous avez essayé de mettre en œuvre et où vous vous battez en réalité. Deuxièmement, les gens vous ont réellement donné 2 solutions à votre problème que vous n'avez même pas dérangé de l'examiner
@Tiago, en info, j'ai déjà la même solution, car il était plus proche de mon problème, mais cela n'avait pas l'exclusion de vacances, à la recherche de toute solution élégante en refactorisant cela. J'ai donc édité ma question avec l'effort que j'ai et j'ai accepté vos efforts comme une réponse et de travailler avec cela intégrant à ma logique commerciale et à l'unité de test. BTW, je ne conviens pas que cette question est si large et nécessite une réponse plus détaillée. Tout ce que je cherche, ce code de base logique / psedo est également bien. Assurez-vous que la meilleure approche est considérée.