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

2voto

Bezüglich der Antwort von Diadistis. Das hat bei mir funktioniert, außer dass ich Floor verwenden musste, um den Bruchteil der Division vor der Multiplikation zu entfernen. So,

d = new DateTime((d.Ticks / TimeSpan.TicksPerSecond) * TimeSpan.TicksPerSecond);

wird

d = new DateTime(Math.Floor(d.Ticks / TimeSpan.TicksPerSecond) * TimeSpan.TicksPerSecond);

Ich hätte erwartet, dass die Division von zwei Long-Werten einen Long-Wert ergibt, so dass der Dezimalteil entfernt wird, aber es wird als Double aufgelöst, so dass nach der Multiplikation genau der gleiche Wert übrig bleibt.

Eppsy

2voto

HerbalMart Punkte 1599

2 Erweiterungsmethoden für die oben genannten Lösungen

    public static bool LiesAfterIgnoringMilliseconds(this DateTime theDate, DateTime compareDate, DateTimeKind kind)
    {
        DateTime thisDate = new DateTime(theDate.Year, theDate.Month, theDate.Day, theDate.Hour, theDate.Minute, theDate.Second, kind);
        compareDate = new DateTime(compareDate.Year, compareDate.Month, compareDate.Day, compareDate.Hour, compareDate.Minute, compareDate.Second, kind);

        return thisDate > compareDate;
    }

    public static bool LiesAfterOrEqualsIgnoringMilliseconds(this DateTime theDate, DateTime compareDate, DateTimeKind kind)
    {
        DateTime thisDate = new DateTime(theDate.Year, theDate.Month, theDate.Day, theDate.Hour, theDate.Minute, theDate.Second, kind);
        compareDate = new DateTime(compareDate.Year, compareDate.Month, compareDate.Day, compareDate.Hour, compareDate.Minute, compareDate.Second, kind);

        return thisDate >= compareDate;
    }

Verwendung:

bool liesAfter = myObject.DateProperty.LiesAfterOrEqualsIgnoringMilliseconds(startDateTime, DateTimeKind.Utc);

2voto

Kyle L. Punkte 524

Dies ist meine Version der Erweiterungsmethoden, die hier und in ähnlichen Fragen gepostet wurden. Dies validiert den Ticks-Wert in einer einfach zu lesenden Weise und bewahrt die DateTimeKind der ursprünglichen DateTime-Instanz. (Dies hat subtile, aber relevante Nebeneffekte beim Speichern in einer Datenbank wie MongoDB).

Wenn das eigentliche Ziel darin besteht, eine DateTime auf einen bestimmten Wert abzuschneiden (z. B. Stunden/Minuten/Sekunden/MS), empfehle ich stattdessen die Implementierung dieser Erweiterungsmethode in Ihrem Code. Dadurch wird sichergestellt, dass Sie nur auf eine gültige Genauigkeit abschneiden können und die wichtigen DateTimeKind-Metadaten Ihrer ursprünglichen Instanz erhalten bleiben:

public static DateTime Truncate(this DateTime dateTime, long ticks)
{
    bool isValid = ticks == TimeSpan.TicksPerDay 
        || ticks == TimeSpan.TicksPerHour 
        || ticks == TimeSpan.TicksPerMinute 
        || ticks == TimeSpan.TicksPerSecond 
        || ticks == TimeSpan.TicksPerMillisecond;

    // https://stackoverflow.com/questions/21704604/have-datetime-now-return-to-the-nearest-second
    return isValid 
        ? DateTime.SpecifyKind(
            new DateTime(
                dateTime.Ticks - (dateTime.Ticks % ticks)
            ),
            dateTime.Kind
        )
        : throw new ArgumentException("Invalid ticks value given. Only TimeSpan tick values are allowed.");
}

Dann können Sie die Methode wie folgt anwenden:

DateTime dateTime = DateTime.UtcNow.Truncate(TimeSpan.TicksPerMillisecond);

dateTime.Kind => DateTimeKind.Utc

0voto

Dhawal Shukal Punkte 13
DateID.Text = DateTime.Today.ToShortDateString();

Use ToShortDateString() //Date 2-02-2016
Use ToShortDateString() // Time 

Und durch die Verwendung von

ToLongDateString() // its show 19 February 2016.

:P

0voto

Dhawal Shukal Punkte 13

Neue Methode

String Date = DateTime.Today.ToString("dd-MMM-yyyy"); 

// String-Übergabeparameter dd-mmm-yyyy definieren return 24-feb-2016

Oder im Textfeld angezeigt

txtDate.Text = DateTime.Today.ToString("dd-MMM-yyyy");

// auf PageonLoad setzen

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