419 Stimmen

Wie man Millisekunden von einem .NET DateTime abschneidet

Ich versuche, einen Zeitstempel aus einer eingehenden Anfrage mit einem in der Datenbank gespeicherten Wert zu vergleichen. SQL Server hält natürlich einige Genauigkeit von Millisekunden auf die Zeit, und wenn in eine .NET DateTime gelesen, es enthält diese Millisekunden. Die eingehende Anforderung an das System bietet jedoch nicht diese Präzision, so dass ich einfach die Millisekunden weglassen muss.

Ich habe das Gefühl, dass ich etwas Offensichtliches übersehe, aber ich habe keinen eleganten Weg gefunden, es zu tun (C#).

677voto

Joe Punkte 117971

Das Folgende funktioniert für eine DateTime, die Bruchteile von Millisekunden hat, und behält auch die Eigenschaft Kind (Local, Utc oder Undefined) bei.

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

oder gleichwertig und kürzer:

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

Dies könnte zu einer Erweiterungsmethode verallgemeinert werden:

public static DateTime Truncate(this DateTime dateTime, TimeSpan timeSpan)
{
    if (timeSpan == TimeSpan.Zero) return dateTime; // Or could throw an ArgumentException
    if (dateTime == DateTime.MinValue || dateTime == DateTime.MaxValue) return dateTime; // do not modify "guard" values
    return dateTime.AddTicks(-(dateTime.Ticks % timeSpan.Ticks));
}

die wie folgt verwendet wird:

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
...

191voto

benPearce Punkte 36232
var date = DateTime.Now;

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

94voto

Sky Sanders Punkte 34472

Hier ist eine Erweiterungsmethode, die auf einer früheren Antwort basiert und mit der Sie auf eine beliebige Auflösung trunkieren können...

Verwendung:

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

Klasse:

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);
    }
}

38voto

chris.w.mclean Punkte 1624
DateTime d = DateTime.Now;
d = d.AddMilliseconds(-d.Millisecond);

16voto

KingPong Punkte 1399

Manchmal möchte man auf etwas Kalenderbasiertes, wie Jahr oder Monat, kürzen. Hier ist eine Erweiterungsmethode, mit der Sie eine beliebige Auflösung wählen können.

public enum DateTimeResolution
{
    Year, Month, Day, Hour, Minute, Second, Millisecond, Tick
}

public static DateTime Truncate(this DateTime self, DateTimeResolution resolution = DateTimeResolution.Second)
{
    switch (resolution)
    {
        case DateTimeResolution.Year:
            return new DateTime(self.Year, 1, 1, 0, 0, 0, 0, self.Kind);
        case DateTimeResolution.Month:
            return new DateTime(self.Year, self.Month, 1, 0, 0, 0, self.Kind);
        case DateTimeResolution.Day:
            return new DateTime(self.Year, self.Month, self.Day, 0, 0, 0, self.Kind);
        case DateTimeResolution.Hour:
            return self.AddTicks(-(self.Ticks % TimeSpan.TicksPerHour));
        case DateTimeResolution.Minute:
            return self.AddTicks(-(self.Ticks % TimeSpan.TicksPerMinute));
        case DateTimeResolution.Second:
            return self.AddTicks(-(self.Ticks % TimeSpan.TicksPerSecond));
        case DateTimeResolution.Millisecond:
            return self.AddTicks(-(self.Ticks % TimeSpan.TicksPerMillisecond));
        case DateTimeResolution.Tick:
            return self.AddTicks(0);
        default:
            throw new ArgumentException("unrecognized resolution", "resolution");
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X