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


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.


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 .


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.


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

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.


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ę


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 .


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

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.


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


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%


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

4

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

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

Zobacz MSDN


+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


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


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


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.


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

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

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.


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

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


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

1

Użyj trochę RegEx:

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

Tworzy datę w formacie: dd / mm / rrrr


1

Do użytku przez datalist, repeater .. na stronie aspx: <% # Eval ("YourDateString"). ToString (). Usuń (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

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

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

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.