Wie entferne ich den Zeitteil des Datums in C # nur im DateTime-Objekt?


458

Ich muss den Zeitteil der Datumszeit entfernen oder habe wahrscheinlich das Datum im folgenden Format in der objectForm, nicht in der Form von string.

06/26/2009 00:00:00:000

Ich kann keine stringKonvertierungsmethoden verwenden, da ich das Datum in objectForm benötige .

Ich habe zuerst versucht, das DateTimein ein zu konvertieren string, das zeitspezifische Datum daraus zu entfernen, aber es wird hinzugefügt 12:00:00 AM, sobald ich es wieder in DateTime objectzurück konvertiere .


10
In C # gibt es keine Nur-Datum-Klasse / -Struktur. Wenn Sie eine haben möchten, müssen Sie Ihre eigene Klasse / Struktur hinzufügen.
Oleschri

12
Verwenden Sie einfach DateTime.Now.ToShortDateString ()
Mohammad Shahnawaz Alam

@ ShahnawazAalam Ich glaube, es ist immer noch eine Zeichenfolge, ich habe auch Probleme mit datetime. brauche nur Datum von datetime Variable

Siehe auch diese Antwort, die Alternativen beschreibt.
Matt Johnson-Pint

var dateTime = DateTime.Now.Date;
PrathapG

Antworten:


826

Verwenden Sie die Date- Eigenschaft:

var dateAndTime = DateTime.Now;
var date = dateAndTime.Date;

Die dateVariable enthält das Datum und den Zeitteil 00:00:00.


36
Wäre der Zeitteil nicht 12:00:00 Uhr, wie vom Fragesteller erwähnt?
Feuer Panda

13
Der Zeitteil ist Null (Mitternacht). Wenn dies als Zeichenfolge im AM / PM-Format formatiert ist, wird dies als 12 AM dargestellt.
Driis

98
Dies beantwortet die Frage nicht. Wie aus der Antwort hervorgeht, hat DateTime.Date (das ist selbst eine DateTime!) Einen Zeitteil, der standardmäßig 00:00:00 ist. Die Antwort sollte eher lauten: Mit DateTime können Sie nicht. Konstruieren Sie Ihre eigene Struktur oder schauen Sie sich Noda Time an.
Tomas Vinter

23
@TomasVinter ist richtig. Im .NET Framework gibt es keine "streng datumsbezogene" Struktur. Sie müssen Ihre eigenen erstellen. DateTime stellt jedoch die .ToShortDateTime () -Methode bereit, mit der eine Zeichenfolge formatiert wird, die nur den Datumsteil des Werts darstellt, und das Datum mithilfe des in der aktuellen Kultur (Thread.Current.CurrentCulture) konfigurierten DateFormat formatiert wird, also MM-dd -JJJJ für die USA, TT-MMM-JJJJ für die EU usw.
Michael J. Heier

16
Für diejenigen, die sagen, dass dies nicht die richtige Antwort ist: Die Antwort ist richtig, aber die Frage ist falsch. Es zeigt die Unkenntnis des Fragestellers über das Thema. Es gibt kein Format für das Datum in Objektform. Format ist nur dann sinnvoll, wenn es in eine Zeichenfolge konvertiert wird. Was tatsächlich in seinem Objekt gespeichert ist 06/26/2009 00:00:00.000, ist nicht , sondern 63381571200000000die Anzahl der Ticks (1/100000000stel Sekunde) seit DateTime.MinValue(01/01/0001). Wenn Sie das Datum anzeigen möchten, konvertieren Sie es in eine Zeichenfolge. Andernfalls hat es eine Zeitkomponente von Mitternacht. Komm damit klar.
CptRobby

165

Sie können Formatzeichenfolgen verwenden, um der Ausgabezeichenfolge das gewünschte Format zu geben.

DateTime dateAndTime = DateTime.Now;
Console.WriteLine(dateAndTime.ToString("dd/MM/yyyy")); // Will give you smth like 25/05/2011

Lesen Sie mehr über benutzerdefinierte Datums- und Zeitformatzeichenfolgen .


48
DateAndTime.ToShortDateString ();
John Peters

Ich brauchte das, war aber CultureInfo.DateTimeFormat.ShortDatePatternbenutzerfreundlich
Dzmitry Lahoda

Dies führt zu einer falschen Ausgabe bei Gebietsschemas, die dieses Format nicht verwenden. Verwenden Sie besser ToShortDateString, das Gebietsschema kennt
Matt Wilko

1
Stellen Sie sicher, dass Sie das Format dd/MM/yyyyauf das gewünschte Format aktualisieren, bevor Sie es verwenden!
Slayernoah

.ToString()mit dem gewünschten format ist genau das was ich brauchte, danke!
Willem Ellis


39

Schauen Sie sich die DateTime.Date- Eigenschaft an.

Ruft die Datumskomponente dieser Instanz ab.


20
Sie sollten mehr erklären, dies ist keine Antwort, dies ist ein Link
Malachi

27
@ Malachi: Ich habe die erste Zeile aus der verknüpften offiziellen API kopiert und eingefügt, nur für den Fall, dass die Leute Hyperlinks nicht verstehen.
Nick

var dateTime = DateTime.Now.Date;
PrathapG

29

Die DateUnterkunft gibt das Datum um Mitternacht zurück.

Eine Möglichkeit könnte darin bestehen, die einzelnen Werte (Tag / Monat / Jahr) separat abzurufen und in dem gewünschten Typ zu speichern.

var dateAndTime = DateTime.Now; 
int year = dateAndTime.Year;
int month = dateAndTime.Month;
int day = dateAndTime.Day;

string.Format("{0}/{1}/{2}", month, day, year);

20

Keine der oben genannten Antworten hat mein Problem mit Winforms gelöst.

Der einfachste Weg, um NUR das Datum zu erreichen, ist die einfache Funktion in Datetime:

DateTime dt = DateTime.now;
String BirthDate = dt.ToShortDateString();

Sie haben nur ein Datum in der Geburtstagszeichenfolge.


4
Warum gibt es eine (string)Besetzung? Der von zurückgegebene Typ ToShortDateStringist in der Tat eine Zeichenfolge.
Askolein

15

Versuchen Sie, Ihre eigene Struktur dafür zu erstellen. Das DateTime-Objekt hat Datum und Uhrzeit


3
Dies sollte die Antwort sein. Es scheint die einzige Antwort auf die eigentliche Frage zu sein - die Zeit kann nicht aus dem Objekt entfernt werden. Rollen Sie Ihre eigenen, leben Sie mit Mitternacht (oder Tageszeit) oder arbeiten Sie mit einer ToString-Darstellung dessen, was Sie wollen.
Phil Cooper

Dies mag die richtigste Antwort sein, ist aber auch völlig akademisch für alle, außer für diejenigen ohne Leben, die gerne ein Rad neu erfinden, das sich von selbst sehr gut dreht. Wenn wir uns wirklich Sorgen über den zusätzlichen Speicher machen, der zum Speichern einer zusätzlichen Long-Eigenschaft mit unserer DateTime-Struktur verwendet wird, haben wir größere Probleme, als sie einfach zu ignorieren.
iGanja

Danke für die Antwort. Ohne eine Struktur zu erstellen, kann der Benutzer in den meisten Fällen eine Zeichenfolgenvariable verwenden. Was denken Sie?
Kushan Randima

@ KushanRandima, das trifft in den meisten Fällen zu. In der Frage möchte der Benutzer jedoch nicht im Zeichenfolgenformat, daher habe ich dies als eine der Alternativen vorgeschlagen.
Umesh CHILAKA

15

Das kannst du nicht. Eine DateTime in .NET hat immer eine Zeit, standardmäßig 00: 00: 00: 000. Die Date-Eigenschaft einer DateTime ist auch eine DateTime (!), Daher ist die Zeit standardmäßig auf 00: 00: 00: 000 eingestellt.

Dies ist ein Mangel in .NET Framework, und es könnte argumentiert werden, dass DateTime in .NET gegen das Prinzip der Einzelverantwortung verstößt .


Dies ist die richtige Antwort auf diese Frage. DateTime-Objekte haben immer Zeit.
Drkawashima

1
Warum würden Sie dies aus Interesse als Verstoß gegen SRP betrachten? Wenn Sie der Meinung sind, dass die Verantwortung einen Zeitpunkt darstellt und die Klasse die zugrunde liegende Ticks-Eigenschaft verfügbar macht, sind die Year / Hour / Millisecond-Eigenschaften nur dazu da, sich mit (Mainstream-) Konventionen zu befassen.
Rob Church

Da Datum und Uhrzeit zwei unterschiedliche Konzepte sind, ist dies in .NET Framework leider in derselben Struktur gebündelt. Somit hat die Struktur mehr als eine Verantwortung (Behandlung von Datum UND Uhrzeit) und verstößt daher gegen SRP. DateTime in .NET repräsentiert nicht nur einen Zeitpunkt, sondern auch viele andere Dinge. Daher wäre es seltsam, wenn man bedenkt, dass es die Verantwortung ist, nur einen Zeitpunkt darzustellen.
Tomas Vinter

2
Ein Zeitpunkt wird sowohl durch Datum als auch durch Uhrzeit dargestellt. Wenn Sie jemandem sagen, er solle Sie um 13:00 Uhr treffen, gehen Sie davon aus, dass die Person weiß, an welchem ​​Tag. Auch wenn heute der Tag ist, schreibt die Präzision dies ausdrücklich vor. Ergo muss ein einzelner Wert, der einen Zeitpunkt mit beliebiger Genauigkeit darstellt, sowohl das Datum als auch die Uhrzeit unter Verwendung eines Referenzstartpunkts enthalten. Daher sind Datum, von einer Startreferenz und Uhrzeit, von einer Startreferenz, eindeutig das gleiche Konzept; Zeit für zusätzliche Präzision.
iGanja

1
Zeit allein ist nützlich, wenn Sie über mehrere Instanzen sprechen: z. B. jeden Tag um Mitternacht UTC; am ersten eines jeden Monats mittags Ortszeit; usw. Möglicherweise kann TimeSpan verwendet werden, um dies über eine Konvention darzustellen, aber es kann sauberer sein, ein Zeitobjekt zu haben, das einen Punkt innerhalb eines Zeitraums von 24 Stunden und eine Zeitzone darstellt. Letztendlich gibt es drei Ideen, die DateTime enthält: Datum, Uhrzeit und Zeitzone.
David Beckman

12

DateTime.Date

var newDate = DateTime.Now; //newDate.Date property is date portion of DateTime

9
du solltest mehr erklären. Dies ist keine Antwort, es ist ein Link
Malachi

2
var newDate = DateTime.Now; Die Eigenschaft //newDate.Date ist der Datumsteil von DateTime. Was ist unklar? Wenn unklar - folgen Sie dem Link.
VikciaR

10

Hier ist eine andere Methode mitString.Format

    DateTime todaysDate = DateTime.UtcNow;

    string dateString = String.Format("{0:dd/MM/yyyy}", todaysDate);

    Console.WriteLine("Date with Time: "+ todaysDate.ToString());

    Console.WriteLine("Date Only : " + dateString);

Ausgabe:

Date with Time: 9/4/2016 11:42:16 AM

Date Only : 04/09/2016

Dies funktioniert auch, wenn das Datum und die Uhrzeit in der Datenbank gespeichert sind.

Weitere Formatierungen für Datum und Uhrzeit finden Sie unter folgenden Links:

Referenz 1

Referenz 2

Hoffnung hilft.


Das OP gibt ausdrücklich an, dass "ich keine Methoden zur Konvertierung von Zeichenfolgen verwenden kann, da ich das Datum in Objektform benötige."
ChrisF

7

Auf diese Weise erhalten Sie nur Datum ohne Zeit

DateTime date = DateTime.Now;
string Strdateonly = date.ToString("d");

Ausgabe = 16.05.2015


1
Bitte beachten Sie, dass es sich lohnt, eine verspätete Antwort hinzuzufügen (und aus Sicht anderer Benutzer positiv zu bewerten), nur wenn sie sich deutlich von anderen Antworten unterscheidet. Was ist hier nicht der Fall.
m.cekiera

5

Ich habe eine DateOnlyStruktur geschrieben. Dies verwendet eine DateTime unter der Haut, aber es werden keine Zeitteile öffentlich zugänglich gemacht:

using System;

public struct DateOnly : IComparable, IFormattable, IComparable<DateOnly>, IEquatable<DateOnly>
{

    private DateTime _dateValue;

    public int CompareTo(object obj)
    {
        if (obj == null)
        {
            return 1;
        }

        DateOnly otherDateOnly = (DateOnly)obj;
        if (otherDateOnly != null)
        {
            return ToDateTime().CompareTo(otherDateOnly.ToDateTime());
        }
        else
        {
            throw new ArgumentException("Object is not a DateOnly");
        }
    }

    int IComparable<DateOnly>.CompareTo(DateOnly other)
    {
        return this.CompareToOfT(other);
    }
    public int CompareToOfT(DateOnly other)
    {
        // If other is not a valid object reference, this instance is greater.
        if (other == new DateOnly())
        {
            return 1;
        }
        return this.ToDateTime().CompareTo(other.ToDateTime());
    }

    bool IEquatable<DateOnly>.Equals(DateOnly other)
    {
        return this.EqualsOfT(other);
    }
    public bool EqualsOfT(DateOnly other)
    {
        if (other == new DateOnly())
        {
            return false;
        }

        if (this.Year == other.Year && this.Month == other.Month && this.Day == other.Day)
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    public static DateOnly Now()
    {
        return new DateOnly(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);
    }

    public static bool TryParse(string s, ref DateOnly result)
    {
        DateTime dateValue = default(DateTime);
        if (DateTime.TryParse(s, out dateValue))
        {
            result = new DateOnly(dateValue.Year, dateValue.Month, dateValue.Day);
            return true;
        }
        else
        {
            return false;
        }
    }

    public static DateOnly Parse(string s)
    {
        DateTime dateValue = default(DateTime);
        dateValue = DateTime.Parse(s);
        return new DateOnly(dateValue.Year, dateValue.Month, dateValue.Day);
    }

    public static DateOnly ParseExact(string s, string format)
    {
        CultureInfo provider = CultureInfo.InvariantCulture;
        DateTime dateValue = default(DateTime);
        dateValue = DateTime.ParseExact(s, format, provider);
        return new DateOnly(dateValue.Year, dateValue.Month, dateValue.Day);
    }

    public DateOnly(int yearValue, int monthValue, int dayValue) : this()
    {
        Year = yearValue;
        Month = monthValue;
        Day = dayValue;
    }

    public DateOnly AddDays(double value)
    {
        DateTime d = new DateTime(this.Year, this.Month, this.Day);
        d = d.AddDays(value);
        return new DateOnly(d.Year, d.Month, d.Day);
    }

    public DateOnly AddMonths(int months)
    {
        DateTime d = new DateTime(this.Year, this.Month, this.Day);
        d = d.AddMonths(months);
        return new DateOnly(d.Year, d.Month, d.Day);
    }

    public DateOnly AddYears(int years)
    {
        DateTime d = new DateTime(this.Year, this.Month, this.Day);
        d = d.AddYears(years);
        return new DateOnly(d.Year, d.Month, d.Day);
    }

    public DayOfWeek DayOfWeek
    {
        get
        {
            return _dateValue.DayOfWeek;
        }
    }

    public DateTime ToDateTime()
    {
        return _dateValue;
    }

    public int Year
    {
        get
        {
            return _dateValue.Year;
        }
        set
        {
            _dateValue = new DateTime(value, Month, Day);
        }
    }

    public int Month
    {
        get
        {
            return _dateValue.Month;
        }
        set
        {
            _dateValue = new DateTime(Year, value, Day);
        }
    }

    public int Day
    {
        get
        {
            return _dateValue.Day;
        }
        set
        {
            _dateValue = new DateTime(Year, Month, value);
        }
    }

    public static bool operator == (DateOnly aDateOnly1, DateOnly aDateOnly2)
    {
        return (aDateOnly1.ToDateTime() == aDateOnly2.ToDateTime());
    }

    public static bool operator != (DateOnly aDateOnly1, DateOnly aDateOnly2)
    {
        return (aDateOnly1.ToDateTime() != aDateOnly2.ToDateTime());
    }

    public static bool operator > (DateOnly aDateOnly1, DateOnly aDateOnly2)
    {
        return (aDateOnly1.ToDateTime() > aDateOnly2.ToDateTime());
    }

    public static bool operator < (DateOnly aDateOnly1, DateOnly aDateOnly2)
    {
        return (aDateOnly1.ToDateTime() < aDateOnly2.ToDateTime());
    }

    public static bool operator >= (DateOnly aDateOnly1, DateOnly aDateOnly2)
    {
        return (aDateOnly1.ToDateTime() >= aDateOnly2.ToDateTime());
    }

    public static bool operator <= (DateOnly aDateOnly1, DateOnly aDateOnly2)
    {
        return (aDateOnly1.ToDateTime() <= aDateOnly2.ToDateTime());
    }

    public static TimeSpan operator - (DateOnly aDateOnly1, DateOnly aDateOnly2)
    {
        return (aDateOnly1.ToDateTime() - aDateOnly2.ToDateTime());
    }


    public override string ToString()
    {
        return _dateValue.ToShortDateString();
    }

    public string ToString(string format)
    {
        return _dateValue.ToString(format);
    }

    public string ToString(string fmt, IFormatProvider provider)
    {
        return string.Format("{0:" + fmt + "}", _dateValue);
    }

    public string ToShortDateString()
    {
        return _dateValue.ToShortDateString();
    }

    public string ToDbFormat()
    {
        return string.Format("{0:yyyy-MM-dd}", _dateValue);
    }
}

Dies wird von VB.NET konvertiert. Wir entschuldigen uns, wenn einige Konvertierungen nicht 100% sind


5

Verwenden Sie date.ToShortDateString (), um das Datum ohne die Zeitkomponente abzurufen

var date = DateTime.Now
var shortDate = date.ToShortDateString() //will give you 16/01/2019

Verwenden Sie date.ToString (), um das Format des Datums anzupassen

var date = DateTime.Now
var shortDate = date.ToString('dd-MMM-yyyy') //will give you 16-Jan-2019

4

Ich bin überrascht, dass niemand DateTime.Today erwähnt hat

var date = DateTime.Today;
// {7/1/2014 12:00:00 AM}

Siehe MSDN


+1 nur, weil Ihre Antwort ein Datum mit den richtigen Eigenschaften erzeugt. Das OP möchte jedoch die Uhrzeit aus einem vorhandenen Datum entfernen und kein neues Datum erstellen.
iGanja

3

Sie können dies für das einzige Datum ab der Datumszeit versuchen

String.Format("{0:d/M/YYYY}",dt);

Wo dt ist das DateTime


3

Kam über diesen Beitrag, als ich versuchte, das ursprüngliche Q zu lösen.

Ich verwende Asp.Net und nach einigen Recherchen, die ich festgestellt habe, wenn Sie an den Wert des Datums im Code dahinter binden, können Sie die Zeit löschen, damit sie nicht auf dem Bildschirm angezeigt wird.

C #:

DateTime Today = DateTime.Now;

aspx:

<%: this.Today.ToShortDateString() %>

3

verwenden

DateTime.Now.ToString("dd-MM-yyyy");

3

Wenn Sie es in einen String konvertieren, können Sie dies ganz einfach so tun.

Ich nehme Datum als Ihr DateTime-Objekt.

date.ToString("d");

Dies gibt Ihnen nur das Datum.


2
string dt = myCalender.SelectedDate.ToString();
string date = dt.Remove(10);
displayDate.Content = date;

Wenn Sie Datum aus dem Kalender nehmen, bekommen wir damit auch Zeit. Welches ist nicht immer erforderlich. Auf diese Weise können wir die Uhrzeit vom Datum entfernen.


2

Nach meiner Erfahrung hat keine der genannten Lösungen funktioniert, vielleicht weil ich die Zeit aus dem extrahierten Datum aus der Datenbank entfernen wollte, aber der folgende Code hat gut funktioniert:

var date = target_date.Value.ToString("dd/MM/yyyy"); 

In der Frage wurde ausdrücklich angegeben, dass das Datum ein Objekt und keine Zeichenfolge sein muss. Diese Lösung gibt eine Zeichenfolge zurück.
Saluce

2

Deklarieren Sie die Variable als Zeichenfolge.

Beispiel:

public string dateOfBirth ;

Weisen Sie dann einen Wert zu wie:

dateOfBirth = ((DateTime)(datetimevaluefromDB)).ToShortDateString();

Leute sollten die Frage lesen und ohne Grund aufhören, Strukturen (auf dem Stapel) in Objekte (auf dem Heap) zu konvertieren.
iGanja

2

Ich weiß, dass dies ein alter Beitrag mit vielen Antworten ist, aber ich habe nicht gesehen, wie der Zeitanteil entfernt werden kann. Angenommen, Sie haben eine DateTimeVariable myDatemit dem Datum und dem Zeitteil. DateTimeMit diesem Konstruktor können Sie ohne Zeitanteil ein neues Objekt daraus erstellen :

public DateTime(int year, int month, int day);

So was:

myDate = new DateTime(myDate.Year, myDate.Month, myDate.Day);

Auf diese Weise erstellen Sie ein neues DateTimeObjekt basierend auf dem alten mit 00:00:00 als Zeitteil.


2

Erstellen Sie eine Struktur, die nur die gewünschten Eigenschaften enthält. Dann eine Erweiterungsmethode, um diese Struktur einfach von einer Instanz von DateTime abzurufen.

public struct DateOnly
{
    public int Day { get; set; }
    public int Month { get; set; }
    public int Year { get; set; }
}

public static class DateOnlyExtensions
{
    public static DateOnly GetDateOnly(this DateTime dt)
    {
        return new DateOnly
        {
            Day = dt.Day,
            Month = dt.Month,
            Year = dt.Year
        };
    }
}

Verwendungszweck

DateTime dt = DateTime.Now;
DateOnly result = dt.GetDateOnly();

2

Verwenden Sie die ToString () -Methode, um nur den Datumsteil abzurufen.

Beispiel: DateTime.Now.Date.ToString ("TT / MM / JJJJ")

Hinweis: Das MM im Format TT / MM / JJJJ muss groß geschrieben werden


1

Die Verwendung von .Date eines DateTime-Objekts ignoriert den Zeitanteil.

Hier ist Code:

DateTime dateA = DateTime.Now;
DateTime dateB = DateTime.Now.AddHours(1).AddMinutes(10).AddSeconds(14);
Console.WriteLine("Date A: {0}",dateA.ToString("o"));
Console.WriteLine("Date B: {0}", dateB.ToString("o"));
Console.WriteLine(String.Format("Comparing objects A==B? {0}", dateA.Equals(dateB)));
Console.WriteLine(String.Format("Comparing ONLY Date property A==B? {0}", dateA.Date.Equals(dateB.Date)));
Console.ReadLine();

Ausgabe:

>Date A: 2014-09-04T07:53:14.6404013+02:00
>Date B: 2014-09-04T09:03:28.6414014+02:00
>Comparing objects A==B? False
>Comparing ONLY Date property A==B? True

1

Verwenden Sie ein bisschen RegEx:

Regex.Match(Date.Now.ToString(), @"^.*?(?= )");

Erzeugt ein Datum im Format: TT / MM / JJJJ


1

Für die Verwendung durch die Datenliste wiederholen Sie .. auf der Aspx-Seite: <% # Eval ("YourDateString"). ToString (). Entfernen Sie (10)%>


1
static void Main(string[] args)
{
    string dateStrings =  "2014-09-01T03:00:00+00:00" ;

    DateTime convertedDate = DateTime.Parse(dateStrings);
    Console.WriteLine("  {0} ----------------- {1}",

    convertedDate,DateTime.Parse(convertedDate.ToString()).ToString("dd/MM/yyyy"));

    Console.Read();
}

1

Dies könnte einfach so gemacht werden:

var dateOnly = new DateTime(dateTime.Year, dateTime.Month, dateTime.Day)

1

Dieser Code gibt Ihnen eine klare Sicht auf das Schreiben Datesowie Timeseparat

string time = DateTime.Now.Hour.ToString("00") + ":" + DateTime.Now.Minute.ToString("00") + ":" + DateTime.Now.Second.ToString("00");
        string date = DateTime.Now.ToString("M-dd-yyyy");
        MessageBox.Show(date + "\n" + time);

Hoffe das hilft.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.