Comment faire pour arrondir les heures basés sur les Minutes(heures+0 si min<30, heures+1 sinon)?
J'ai besoin de plus pour arrondir les heures en minutes dans une variable DateTime. La condition est la suivante: si les minutes sont inférieures à 30, puis les minutes doivent être mis à zéro et aucune modification des heures, de l'autre, s'minutes >=30, les heures de travail doivent être mis à heures+1 et les minutes sont de nouveau mis à zéro. Les secondes sont ignorés.
exemple:
11/08/2008 04:30:49
devrait devenir 11/08/2008 05:00:00
et 11/08/2008 04:29:49
devrait devenir 11/08/2008 04:00:00
J'ai écrit du code qui fonctionne parfaitement bien, mais je voulais juste savoir une meilleure méthode, elle pourrait être écrite et apprécieraient également de la méthode alternative(s).
string date1 = "11/08/2008 04:30:49";
DateTime startTime;
DateTime.TryParseExact(date1, "MM/dd/yyyy HH:mm:ss", null,
System.Globalization.DateTimeStyles.None, out startTime);
if (Convert.ToInt32((startTime.Minute.ToString())) > 29)
{
startTime = DateTime.Parse(string.Format("{0}/{1}/{2} {3}:{4}:{5}",
startTime.Month.ToString(), startTime.Day.ToString(),
startTime.Year.ToString(), startTime.Hour.ToString(), "00", "00"));
startTime = startTime.Add(TimeSpan.Parse("01:00:00"));
Console.WriteLine("startTime is :: {0}",
startTime.ToString("MM/dd/yyyy HH:mm:ss"));
}
else
{
startTime = DateTime.Parse(string.Format("{0}/{1}/{2} {3}:{4}:{5}",
startTime.Month.ToString(),
startTime.Day.ToString(), startTime.Year.ToString(),
startTime.Hour.ToString(), "00", "00"));
Console.WriteLine("startTime is :: {0}",
startTime.ToString("MM/dd/yyyy HH:mm:ss"));
}
Suggestions de Russell_Steen, Hans_Kesting et Hojo sont également acceptables.
double possible de Est-il une meilleure façon de couper un DateTime pour une précision spécifique?
Il est plus judicieux de suggérer le duplicate / des postes similaires quand le Q est nouvelle et n'ai pas eu de réponse encore .. ce n'est pas à jeter un oeil à la DOUBLE POSSIBLE MAINTENANT, après l'obtention de la solution idéale qui répond à mon besoin.
Dupliquer les messages sont affichés en haut comme par le MOTS CLÉS tapé dans le titre de la colonne. Donc la recherche ne peut être qu'efficace. de plus .. Éventuellement en double post n'est pas liée à mon poste..
OriginalL'auteur InfantPro'Aravind' | 2010-03-23
Vous devez vous connecter pour publier un commentaire.
Tout aussi une alternative:
mis à jour.
très humoristique 🙂 🙂
OriginalL'auteur tvanfosson
Si la vitesse est un problème, la suivante devrait être la façon la plus rapide:
C'est aussi une jolie façon directe et simple de la façon de le faire.
À expliquer, une structure DateTime n'ont pas réellement de champs que le magasin de l'année, mois, jour, heure, minute, etc. Il stocke un seul
long
valeur, le nombre de "tiques" depuis une certaine époque (Jan 1, 1 AD). Une tique est de 100 nanosecondes, ou un de 10 000 000 ème de seconde.Tout moment vous utilisez l'une des propriétés de date/heure, il divise par la bonne constante.
Donc, ici, nous ajoutons une constante égale à 30 minutes (30 * 60 * 1e7 = 18000000000 tiques), puis de soustraire le reste après division par une constante égale à une heure (60 * 60 * 1e7 = 36000000000 les tiques).
merci pour l'explication. J'essaie de mettre en œuvre cette technique d'autre si nécessaire.
Vous pouvez également modifier l'instruction de retour à
return new DateTime(ticks - ticks % 36000000000, dt.Kind));
afin de préserver l'DateTime type de la valeur de type DateTime.OriginalL'auteur P Daddy
Ce sujet:
Pas besoin de se convertir à la chaîne et au retour!
EDIT:
À l'aide d'un
input.Hour+1
dans le constructeur ne fonctionnera pas si l'Heure est de 23. Le.AddHours(1)
correctement le résultat "0:00" la prochaine journée.OriginalL'auteur Hans Kesting
Je ne sais pas pourquoi, mais AddHours() la méthode ne fonctionne pas .. mais si la condition devient satisfait,
manqué une cession. devez affecter le résultat de addhours retour à la s. faute de frappe
J'ai ajouté
startTime = startTime.AddSeconds(-1 * startTime.Second);
si les secondes sont remises à 0 de trop, pas un problème.- enfant de bonne prise. Je l'ai changé pour un nouveau datetime pour plus de précision (également tronquer tout millisecondes)
OriginalL'auteur Russell Steen
L'extension de Hans Kestings bonne Réponse:
L' (int) Exprimés peut ne pas être nécessaire.
EDIT: Adapté aux corrections de Hans Kesting fait dans sa Réponse.
OriginalL'auteur Morfildur
À améliorer sur certains des autres méthodes, voici une méthode qui vous permettra également de préserver l'DateTime Genre:
OriginalL'auteur CrimsonX
Va ici!
Et pour ceux qui veulent étages
OriginalL'auteur mcintyre321
Basé sur la P de Papa solution, je propose de ne pas coder en dur que grand nombre de tiques à une heure. Coder en dur est mal, n'est-ce pas? Avec cette nouvelle solution, vous pouvez maintenant le tour de tout temps, pour n'importe quel nombre de minutes:
- Je l'utiliser pour l'arrondi au plus proche à 5 minutes, par exemple, 22:23 devient 22:25.
Il y a des années j'ai utilisé la même méthode pour arrondir les montants d'argent le plus proche est à 25 cent, par exemple $ de 22,23 devient de 22,25$. Mais le chef de projet parfois changé son esprit, mais en changeant le mode d'arrondi au plus proche de 10 ou de 5 cent serait trivial. Alors maintenant, j'ai de même n'ont pas à être nerveux quand mon projet mgr veut arrondissement fois pour un autre tour n ° de minutes.
Donc cette méthode d'arrondi est à la fois rapide et flexible.
Ma méthode a déjà été trouvé et publié dans cette année 2008, AFIN de solution
OriginalL'auteur Roland
OriginalL'auteur Hojo