380 votes

Comment tronquer millisecondes hors de l' .NET DateTime

Je suis en train de comparer un horodatage à partir de la réception d'une demande à une base de données à valeur stockée. SQL Server bien sûr conserve un certain degré de précision de millisecondes sur le temps, et quand on les lit dans un .NET DateTime, il comprend les millisecondes. La demande entrante pour le système, cependant, n'offre pas cette précision, j'ai donc besoin de simplement déposer les millisecondes.

J'ai l'impression de rater quelque chose d'évident, mais je n'ai pas trouvé une manière élégante de le faire (C#).

624voto

Joe Points 60749

La suivante va travailler pour un DateTime qui a les fractions de millisecondes, et de préserver la Nature des biens (Locaux, Utc ou non).

DateTime dateTime = ... anything ...
dateTime = new DateTime(
    dateTime.Ticks - (dateTime.Ticks % TimeSpan.TicksPerSecond), 
    dateTime.Kind
    );

ou l'équivalent et plus courte:

dateTime = dateTime.AddTicks( - (dateTime.Ticks % TimeSpan.TicksPerSecond));

Cela pourrait être généralisée en une extension de la méthode:

public static DateTime Truncate(this DateTime dateTime, TimeSpan timeSpan)
{
    if (timeSpan == TimeSpan.Zero) return dateTime; // Or could throw an ArgumentException
    return dateTime.AddTicks(-(dateTime.Ticks % timeSpan.Ticks));
}

qui est utilisé comme suit:

dateTime = dateTime.Truncate(TimeSpan.FromMilliseconds(1)); // Truncate to whole ms
dateTime = dateTime.Truncate(TimeSpan.FromSeconds(1)); // Truncate to whole second
dateTime = dateTime.Truncate(TimeSpan.FromMinutes(1)); // Truncate to whole minute
...

167voto

benPearce Points 9817
date = DateTime.Now;

date = new DateTime(date.Year,date.Month,date.Day,date.Hour,date.Minute,date.Second)

74voto

Sky Sanders Points 19557

Ici est une extension de la méthode basée sur une précédente réponse qui vous permettra de tronquer la résolution...

Utilisation:

DateTime myDateSansMilliseconds = myDate.Truncate(TimeSpan.TicksPerSecond);
DateTime myDateSansSeconds = myDate.Truncate(TimeSpan.TicksPerMinute)

Classe:

public static class DateTimeUtils
{
    /// <summary>
    /// <para>Truncates a DateTime to a specified resolution.</para>
    /// <para>A convenient source for resolution is TimeSpan.TicksPerXXXX constants.</para>
    /// </summary>
    /// <param name="date">The DateTime object to truncate</param>
    /// <param name="resolution">e.g. to round to nearest second, TimeSpan.TicksPerSecond</param>
    /// <returns>Truncated DateTime</returns>
    public static DateTime Truncate(this DateTime date, long resolution)
    {
        return new DateTime(date.Ticks - (date.Ticks % resolution), date.Kind);
    }
}

35voto

chris.w.mclean Points 1293
DateTime d = DateTime.Now;
d = d.AddMilliseconds(-d.Millisecond);

11voto

Bob Points 34449

Au lieu de baisser les millisecondes en comparant ensuite, pourquoi ne pas comparer la différence?

DateTime x; DateTime y;
bool areEqual = (x-y).TotalSeconds == 0;

ou

TimeSpan precision = TimeSpan.FromSeconds(1);
bool areEqual = (x-y).Duration() < precision;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X