Pouvez-vous autour d'une .NET objet TimeSpan?
Pouvez-vous autour d'une .NET TimeSpan
objet?
J'ai un Timespan
valeur de l': 00:00:00.6193789
Est-il un moyen simple de garder une TimeSpan
objet, mais autour d'elle pour quelque chose comme
00:00:00.62?
Juste un avertissement pour les autres. J'allais en bas de la route de l'aide de Temps en propriété publique hors d'un objet métier. Je ne savais pas que TimeSpan n'était pas un "XmlSerializable" type de données. La Discussion sur la question: devnewsgroups.net/group/microsoft.public.dotnet.framework/...
OriginalL'auteur BuddyJoe | 2008-12-03
Vous devez vous connecter pour publier un commentaire.
Désolé, les gars, mais les deux la question et la réponse sont jusqu'à présent mal 🙂
La question est mal parce que Tyndall demande un moyen de ronde mais montre un exemple de troncature.
Sera Doyen de la réponse est incorrecte, car elle aborde également les troncature plutôt que arrondissement. (Je suppose que l'on pourrait faire valoir que la réponse est juste pour l'une des deux questions, mais laissons la philosophie de côté pour le moment...)
Voici une technique simple pour arrondissement:
Avec la valeur d'entrée et le nombre de chiffres dans l'exemple de code, c'est la sortie:
Modifier la précision de 2 chiffres 5 chiffres et obtenir ceci à la place:
Et même de changer à 0 pour obtenir ce résultat:
Enfin, si vous voulez juste un peu plus de contrôle sur la sortie, ajouter un peu de mise en forme. Voici un exemple, qui montre que vous pouvez séparer la précision du nombre de chiffres affichés. La précision est de nouveau fixé à 2 mais à 3 chiffres sont affichés, comme spécifié dans le dernier argument du formatage de chaîne de contrôle:
2010.01.06 mise à JOUR: Un Out-of-the-box Solution
Le matériel ci-dessus sont utiles si vous êtes à la recherche d'idées; depuis, j'ai eu le temps de mettre en œuvre une solution packagée pour ceux à la recherche de prêt-à-utiliser le code.
Noter que c'est sans commentaire code. L'commenté complet version avec XML-doc-commentaires seront disponibles dans mon bibliothèque open source par la fin du trimestre. Bien que j'ai hésité à le poster "raw" comme ça, je me dis que ça pourrait quand même être d'une certaine utilité pour les lecteurs intéressés.
Ce code améliore mon code ci-dessus qui, bien arrondis, montraient encore 7 places, complétée par des zéros. Cette version finale des tours et des garnitures pour le nombre spécifié de chiffres.
Voici un exemple d'appel:
Et voici la RoundedTimeSpan.cs fichier:
2010.02.01 mise à JOUR: solution packagée maintenant disponible
Je viens de sortir une nouvelle version de mon bibliothèques open-source hier, plus tôt que prévu, y compris la RoundedTimeSpan que j'ai décrit ci-dessus. Le Code est ici; pour l'API de commencer ici puis accédez à
RoundedTimeSpan
en vertu de laCleanCode.Data
espace de noms. L'CleanCode.DLL la bibliothèque comprend le code indiqué ci-dessus, mais il fournit dans un emballage fini. Notez que j'ai fait une légère amélioration dans leToString(int)
méthode ci-dessus depuis que je l'ai posté sur 2010.01.06.NetMage la plus récente de réponse est aussi très agréable, si vous voulez des multiples de l'arbitraire d'un laps de temps. E. g. parfois, vous voulez secondes, parfois quelques minutes, parfois quelques millisecondes.
OriginalL'auteur Michael Sorens
TimeSpan est plus petit qu'un wrapper autour de la "Tiques" membre. Il est assez facile de créer un nouveau laps de Temps à partir d'un arrondi version d'un autre laps de Temps de Tiques.
Donne:
La réponse tronque (et pour être juste, donc la question n'). Si vous voulez plutôt tour, certains des autres réponses le faire, mais aucun n'est aussi simple qu'il peut être. Voir ma réponse.
NetMage la plus récente de réponse est aussi très agréable, si vous voulez des multiples de l'arbitraire d'un laps de temps. E. g. parfois, vous voulez secondes, parfois quelques minutes, parfois quelques millisecondes.
OriginalL'auteur Will Dean
Si vous voulez une plage de Temps, de ses un one-liner:
Si vous voulez une chaîne de caractères:
Crédits:
cc1960 expositions de la réponse de l'utilisation de FromSeconds, mais il a arrondi à l'entier de secondes. Ma réponse généralise à un nombre spécifié de chiffres.
Ed réponse suggère d'utiliser une chaîne de format, et inclut un lien pour la mise en forme du document.
À arrondir au multiple de certains autres, comme le 1 /30e de seconde:
À utiliser l'un de ces à tour à des multiples de 1 /30e de seconde:
Résultats affichés dans le débogueur:
public static TimeSpan RoundSeconds(this TimeSpan span, int nDigits = 0)
NetMage la plus récente de réponse c'est sympa, si vous voulez des multiples de l'arbitraire d'un laps de temps. E. g. parfois, vous voulez secondes, parfois quelques minutes, parfois quelques millisecondes.
Pour
RoundSecondsAsString
: Esprit que le maximum nombre de chiffres (f
's) que vous pouvez ajouter est 7! Il y aura aussi un orphelin virgule à la fin sinDigits == 0
OriginalL'auteur ToolmakerSteve
Compte tenu de certains des commentaires au sujet de l'arrondissement de secondes, j'ai pensé arrondi à tout TimeSpan serait sympa:
Étant donné le potentiel des inexactitudes arrondi à tiques lorsqu'ils traitent avec des fractions d'unités (par @ToolmakerSteve), je suis l'ajout d'une fraction de l'arrondissement option lorsque vous avez besoin d'une précision plus élevée et sont arrondis à un ordinateur fractions de secondes:
Bon point, mais qui n'est pas différent de la plupart des autres opérations en virgule flottante dans la programmation. Otoh, que, il est difficile de créer de 1/30 de seconde de Temps depuis que Microsoft ne l'a pas mise en œuvre FromTotal* * * des variations de l'usine de fonctions, alors j'espère que vous avez besoin de savoir ce que vous faites pour y arriver.
Au contraire, c'est différent de la façon suivante: votre solution introduit une limitation qui n'existe pas dans les données sous-jacentes. Vous avez mis en place cette limitation en utilisant un diviseur, "rnd", c'est un integer nombre de tiques. Le résultat peut être sensiblement de mal, si quelqu'un veut un diviseur ce qui n'est pas exprimable comme un nombre entier de tiques. C'est une erreur plus grande qu'en virgule flottante arrondi erreur, ce qui serait tout au plus entraîner une réponse qui a été éteint par 1. Toute personne utilisant ce besoin de comprendre cette limitation.
.. dans la pratique, il semble qu'il importe seulement pour de petites valeurs de
rnd
. Afin de 1/30 de seconde, l'erreur n'est pas assez important pour presque n'importe quel usage. La plus petiternd
vieillit, plus elle peut devenir un problème. Je voulais juste marquer le fait qu'il existe un potentiel d'inexactitude ici, qui se produit en raison de Temps n'est pas une valeur en virgule flottante, donc devient de plus en plus imprécis que les valeurs deviennent plus petits. (La solution dans ces cas serait de pas tentative de représenterrnd
comme unTimeSpan
; au lieu d'utiliser un nombre à virgule flottante de secondes.)Depuis la plus petite unité de temps peut s'exprimer en
TimeSpan
est une tique, ne veut pas dire que vous ne pouvez pas autour d'uneTimeSpan
uniformément à 1/30 de seconde, peu importe comment vous faire le calcul?OriginalL'auteur NetMage
OriginalL'auteur mapache
Pas sûr de Temps, mais vous devriez vérifier ce post sur DateTimes:
http://mikeinmadison.wordpress.com/2008/03/12/datetimeround/
OriginalL'auteur Joel Coehoorn
Voici une belle Extension-Méthode:
Et voici quelques Exemples:
OriginalL'auteur Gewalius
Encore une autre façon de tour de millisecondes à la seconde près.
OriginalL'auteur Buzz
Ma solution:
OriginalL'auteur cc1960
Une méthode d'extension si vous avez besoin de travailler avec
DateTime
à la place, mais encore envie de tour du temps. Dans mon cas, je tenais à tour à la minute.OriginalL'auteur Math M.