Jak usunąć część czasu w C # tylko w obiekcie DateTime?

457

Muszę usunąć część czasu z datą lub prawdopodobnie mam datę w następującym formacie w objectformie innej niż string.

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

Nie mogę korzystać z żadnych stringmetod konwersji, ponieważ potrzebuję daty w objectformie.

Najpierw próbowałem przekonwertować na DateTimea string, usunąć z niej konkretną datę, ale dodaje się, 12:00:00 AMjak tylko przekonwertuję ją z powrotem na DateTime objectpoprzednią.

jestem bezużyteczny
źródło
10
W C # nie ma klasy / struktury tylko daty. Jeśli chcesz go mieć, musisz dodać własną klasę / strukturę.
oleschri
12
Wystarczy użyć DateTime.Now.ToShortDateString ()
Mohammad Shahnawaz Alam
@ShahnawazAalam wierzę, że to wciąż ciąg, mam też problemy z datetime. potrzebuję tylko daty ze zmiennej datetime
Zobacz także tę odpowiedź, która opisuje alternatywy.
Matt Johnson-Pint
var dateTime = DateTime.Now.Date;
PrathapG

Odpowiedzi:

825

Użyj właściwości Data :

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

dateZmienna będzie zawierać datę, część czasu będzie 00:00:00.

driis
źródło
36
Czy część czasu nie byłaby o godzinie 00:00, jak wspomniał pytający?
FIre Panda,
13
Część czasu wynosi zero (północ). Gdy jest on sformatowany jako ciąg znaków w formacie AM / PM, jest on reprezentowany jako 12 AM.
driis
98
To nie odpowiada na pytanie. Jak sugeruje odpowiedź, DateTime.Date (która sama jest DateTime!) Ma domyślną część czasu 00:00:00. Odpowiedź powinna raczej brzmieć: z DateTime nie możesz. Zbuduj własną strukturę lub spójrz na Czas Nody.
Tomas Vinter,
23
@TomasVinter jest poprawny. W systemie .NET nie ma struktury „ściśle-data”. Będziesz musiał stworzyć swój własny. Jednak DateTime udostępnia metodę .ToShortDateTime (), która sformatuje ciąg reprezentujący tylko część wartości daty i sformatuje datę przy użyciu DateFormat skonfigurowanego w bieżącej kulturze (Thread.Current.CurrentCulture), więc MM-dd -rrrr dla USA, dd-MMM-rrrr dla UE itp.
Michael J. Heier
16
Dla tych, którzy mówią, że to nie jest poprawna odpowiedź: odpowiedź jest prawidłowa, ale pytanie jest błędne. Pokazuje ignorancję pytającego na ten temat. Nie ma formatu daty w formie obiektowej. Format ma znaczenie tylko wtedy, gdy jest konwertowany na ciąg. To, co tak naprawdę jest przechowywane w jego obiekcie, nie jest 06/26/2009 00:00:00.000, ale 63381571200000000jest to liczba DateTime.MinValueTików (1/100000000 sekundy) od (01/01/0001). Jeśli zamierzasz wyświetlić datę, przekonwertuj ją na ciąg, w przeciwnym razie będzie ona składać się z północy. Sobie z tym poradzić.
CptRobby
165

Możesz użyć ciągów formatu, aby nadać ciągowi wyjściowemu pożądany format.

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

Przeczytaj więcej o niestandardowych ciągach formatu daty i godziny .

0x49D1
źródło
48
DateAndTime.ToShortDateString ();
John Peters
Potrzebowałem tego, ale byłem CultureInfo.DateTimeFormat.ShortDatePatternprzyjazny dla użytkownika
Dzmitry Lahoda,
To da niepoprawne dane wyjściowe w ustawieniach regionalnych, które nie używają tego formatu. Lepiej używać ToShortDateString, który jest świadom lokalnych ustawień
Matt Wilko
1
Upewnij się, że zaktualizowałeś format dd/MM/yyyydo tego, co chcesz przed użyciem tego!
slayernoah
.ToString()dzięki pożądanemu formatowi jest dokładnie to, czego potrzebowałem, dzięki!
Willem Ellis,
39

Spójrz na właściwość DateTime.Date .

Pobiera składnik daty tego wystąpienia.

Nacięcie
źródło
20
powinieneś wyjaśnić więcej, to nie jest odpowiedź, to jest link
Malachi
27
@Malachi: Skopiowałem i wkleiłem pierwszą linię z oficjalnego API powiązanego na wypadek, gdyby ludzie nie rozumieli hiperłączy.
Nick
var dateTime = DateTime.Now.Date;
PrathapG
29

DateWłasność zwróci datę o północy.

Jedną z opcji może być oddzielne pobranie poszczególnych wartości (dzień / miesiąc / rok) i zapisanie ich w żądanym typie.

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

string.Format("{0}/{1}/{2}", month, day, year);
Początkujący programista
źródło
20

Żadna z powyższych odpowiedzi nie rozwiązała mojego problemu z winformami.

najłatwiejszym sposobem dotarcia TYLKO do daty jest prosta funkcja w Datetime:

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

Będziesz mieć tylko datę w ciągu urodzin.

MehraD
źródło
4
Dlaczego jest (string)obsada? Typ zwracany przez ToShortDateStringjest rzeczywiście ciągiem.
Askolein
15

Spróbuj stworzyć własną strukturę do tego. Obiekt DateTime będzie miał datę i godzinę

Umesh CHILAKA
źródło
3
To powinna być odpowiedź. Wydaje się, że jest to jedyna odpowiedź na rzeczywiste pytanie - czasu nie można usunąć z obiektu. Rzuć własną, żyj z północą (lub porą dnia) lub pracuj z ToString reprezentacją tego, co chcesz.
Phil Cooper
To może być najbardziej poprawna odpowiedź, ale jest również całkowicie akademicka dla wszystkich oprócz tych, którzy nie mają życia, którzy lubią odkrywać koło, które bardzo ładnie się kręci. Jeśli naprawdę martwimy się o to, że wykorzystana pamięć przechowuje dodatkową długą właściwość za pomocą naszej struktury DateTime, mamy większe problemy, niż zwykłe ignorowanie.
iGanja
Dziękuję za odpowiedź. Bez tworzenia struktury użytkownik może w większości przypadków używać zmiennej łańcuchowej. Co myślisz?
Kushan Randima,
@KushanRandima, tak jest w większości przypadków. Jednak w pytaniu użytkownik nie chce w formacie ciągu, dlatego zasugerowałem to jako jedną z alternatyw.
Umesh CHILAKA,
15

Nie możesz DateTime w .NET zawsze ma czas, domyślnie 00: 00: 00: 000. Właściwość Date dla DateTime jest również DateTime (!), A zatem ma domyślny czas 00: 00: 00: 000.

Jest to niedobór w .NET Framework i można argumentować, że DateTime w .NET narusza zasadę pojedynczej odpowiedzialności .

Tomas Vinter
źródło
To jest poprawna odpowiedź na to pytanie. Obiekty DateTime zawsze będą miały czas.
Drkawashima,
1
Z braku zainteresowania, dlaczego uważasz to za naruszenie SRP? Jeśli uważasz, że odpowiedzialność reprezentuje punkt w czasie, a klasa ujawnia podstawową właściwość Ticks, właściwości Rok / Godzina / Milisekunda służą wyłącznie temu, aby poradzić sobie z konwencją (głównego nurtu).
Rob Church
Ponieważ data i godzina to dwie różne koncepcje, niestety w .NET Framework zawartej w tej samej strukturze. Tak więc struktura ma więcej niż jedną odpowiedzialność (obsługa zarówno daty, jak i godziny), a zatem narusza SRP. DateTime w .NET to nie tylko punkt w czasie, ale także wiele innych rzeczy. Dlatego rozważanie odpowiedzialności za reprezentowanie punktu w czasie byłoby dziwne.
Tomas Vinter
2
punkt w czasie jest reprezentowany zarówno przez datę, jak i godzinę. Jeśli powiesz komuś, by spotkał się z tobą o 13:00, przyjmujesz ogromne założenie, że ta osoba wie, który dzień. Nawet jeśli dzisiaj jest dzień, precyzja narzuca to wprost. Ergo pojedyncza wartość reprezentująca punkt w czasie z dowolną precyzją MUSI obejmować zarówno datę, jak i godzinę, używając referencyjnego punktu początkowego. Dlatego data, od odniesienia początkowego, i godzina, od odniesienia początkowego, są wyraźnie SAMĄ koncepcją; czas dodając dodatkową precyzję.
iGanja
1
Sam czas jest przydatny, gdy mówisz o wielu instancjach: np. Codziennie o północy UTC; pierwszego każdego miesiąca w południe czasu lokalnego; itp. Być może można użyć TimeSpan do przedstawienia tego za pomocą konwencji, ale może być czystsze mieć obiekt Time reprezentujący punkt w ciągu 24 godzin i strefę czasową. Ostatecznie istnieją 3 pomysły, które zawiera DateTime: Data, Czas i Strefa Czasowa.
David Beckman,
12

DateTime.Date

var newDate = DateTime.Now; //newDate.Date property is date portion of DateTime
VikciaR
źródło
9
powinieneś wyjaśnić więcej. to nie jest odpowiedź, to link
Malachi
2
var newDate = DateTime.Now; //newDate.Date Właściwość jest częścią DateTime. Co jest niejasne? Jeśli niejasne - kliknij link.
VikciaR
10

Oto inna metoda użyciaString.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);

Wynik:

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

Date Only : 04/09/2016

Działa to również, jeśli data i godzina są przechowywane w bazie danych.

Aby uzyskać więcej informacji o formatowaniu daty i godziny, sprawdź te linki:

Odniesienie 1

Odnośnik 2

Nadzieja pomaga.

Shaijut
źródło
OP wyraźnie stwierdza: „Nie mogę używać żadnych metod konwersji ciągów, ponieważ potrzebuję daty w postaci obiektowej”.
ChrisF
7

Ten sposób na uzyskanie tylko daty bez czasu

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

Wyjście = 5/16/2015

Mayank Gupta
źródło
1
Proszę wziąć pod uwagę, że późna odpowiedź jest warta dodania (i opinii z perspektywy innych użytkowników), tylko jeśli wyraźnie różni się od innych odpowiedzi. Co nie jest tutaj przypadkiem.
m.cekiera
5

Napisałem DateOnlystrukturę. Używa DateTime pod skórą, ale żadne części czasu nie są publicznie dostępne:

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

To jest konwertowane z VB.NET, więc przepraszamy, jeśli niektóre konwersje nie są w 100%

Matt Wilko
źródło
5

Użyj date.ToShortDateString (), aby uzyskać datę bez składnika czasu

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

użyj date.ToString (), aby dostosować format daty

var date = DateTime.Now
var shortDate = date.ToString('dd-MMM-yyyy') //will give you 16-Jan-2019
Nathanael Mayne
źródło
4

Dziwi mnie, że nikt nie wspomniał o DateTime.Today

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

Zobacz MSDN

LukeF
źródło
+1 tylko dlatego, że twoja odpowiedź tworzy datę z właściwymi właściwościami, jednak PO chce usunąć czas z istniejącej daty, a nie utworzyć nową datę.
iGanja
3

Możesz tego spróbować tylko dla daty od daty i godziny

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

Gdzie dt jest DateTime

Vikas
źródło
3

Znalazłem się w tym poście, próbując rozwiązać oryginalne pytanie Q.

Korzystam z Asp.Net i po kilku badaniach, które znalazłem, gdy wiążesz wartość daty w kodzie z tyłu, możesz upuścić czas, aby nie był wyświetlany na ekranie.

DO#:

DateTime Today = DateTime.Now;

aspx:

<%: this.Today.ToShortDateString() %>
Jan
źródło
3

posługiwać się

DateTime.Now.ToString("dd-MM-yyyy");
James
źródło
3

Jeśli konwertujesz go na ciąg, możesz to łatwo zrobić w ten sposób.

Przyjmuję datę jako twój obiekt DateTime.

date.ToString("d");

To da ci tylko datę.

TAS
źródło
2
string dt = myCalender.SelectedDate.ToString();
string date = dt.Remove(10);
displayDate.Content = date;

Jeśli wybierzesz datę z kalendarza, dzięki temu otrzymamy również czas. Co nie jest wymagane przez cały czas. Za pomocą tego możemy usunąć czas z daty.

hizbul25
źródło
2

z mojego doświadczenia żadne z wymienionych rozwiązań nie działało, może dlatego, że chciałem usunąć czas z wyodrębnionej daty z bazy danych, ale poniższy kod działał dobrze:

var date = target_date.Value.ToString("dd/MM/yyyy"); 
Daniel
źródło
Pytanie wyraźnie mówiło, że data musi być przedmiotem, a nie ciągiem. To rozwiązanie zwraca ciąg znaków.
saluce
2

Zadeklaruj zmienną jako ciąg.

przykład:

public string dateOfBirth ;

następnie przypisz wartość taką jak:

dateOfBirth = ((DateTime)(datetimevaluefromDB)).ToShortDateString();
Saud Khan
źródło
ludzie powinni przeczytać pytanie i przestać konwertować struktury (na stosie) na obiekty (na stosie) bez powodu.
iGanja
2

Wiem, że to stary post z wieloma odpowiedziami, ale nie widziałem tego sposobu na usunięcie części czasu. Załóżmy, że masz DateTimezmienną o nazwie myDate, z datą i częścią czasu. Możesz stworzyć z niego nowy DateTimeobiekt bez części czasu, używając tego konstruktora:

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

Lubię to:

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

W ten sposób tworzysz nowy DateTimeobiekt na podstawie starego, z 00:00:00 jako częścią czasu.

Guillermo Gutiérrez
źródło
2

Utwórz strukturę zawierającą tylko te właściwości, które chcesz. Następnie metoda rozszerzenia, aby łatwo uzyskać tę strukturę z instancji DateTime.

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

Stosowanie

DateTime dt = DateTime.Now;
DateOnly result = dt.GetDateOnly();
mason
źródło
2

Aby uzyskać tylko część daty, użyj metody ToString (),

przykład: DateTime.Now.Date.ToString („dd / MM / rrrr”)

Uwaga: mm w formacie dd / MM / rrrr musi być pisane wielkimi literami

nate.py
źródło
1

Użycie .Date obiektu DateTime zignoruje część czasu.

Oto kod:

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

Wynik:

>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
Jota
źródło
1

Użyj trochę RegEx:

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

Tworzy datę w formacie: dd / mm / rrrr

DividedByZero
źródło
1

Do użytku przez datalist, repeater .. na stronie aspx: <% # Eval ("YourDateString"). ToString (). Usuń (10)%>

Filip Dialm
źródło
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();
}
ImranNaqvi
źródło
1

Można to po prostu zrobić w następujący sposób:

var dateOnly = new DateTime(dateTime.Year, dateTime.Month, dateTime.Day)
HichemSeeSharp
źródło
1

Ten kod daje wyraźny obraz pisania, Datea także Timeosobno

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

Mam nadzieję że to pomoże.

Zero
źródło