Obțineți numai data fără ora din DateTime (Programare, C#)

user3085995 a intrebat.

am întâlnit o situație în care trebuie să obțin doar data și ora. Date din DateTime.

Am un DateTime? StartDate proprietate (Nullable) utilizată pentru a păstra valoarea datei

am încercat mai jos,

var d = Convert.ToDateTime(StartDate).Date;

dar îmi returnează o dată ca de exemplu. 6/22/2006 12:00:00AM

după ce am făcut var d = Convert.ToDateTime(StartDate).Date.ToString("d");

am reușit să obțin d ca 6/22/2006…dar nu vreau să-mi convertesc DateTime? în String

există vreo modalitate de a obține doar Date fără a folosi ToString("d")?

Comentarii

  • A DateTime are întotdeauna o componentă de timp, chiar și Date-returnează un Date cu o oră stabilită la 12:00:00 miezul nopții. Deci nu, nu există nicio modalitate de a obține a Datenumai fără a-l converti în șir de caractere. Dar de ce vă lipsește? –  > Por Tim Schmelter.
  • În loc de Convert.ToDateTime(StartDate).Date, utilizați StartDate.Value.Date. Ambele vor arunca o excepție în cazul în care StartDate este nulă, așa că trebuie să vă asigurați că nu este. –  > Por Jeppe Stig Nielsen.
  • Puteți explica de ce este aceasta o problemă? Există vreun motiv anume pentru care nu puteți folosi un simplu DateTime și să ignori pur și simplu partea de timp? –  > Por Kjartan.
4 răspunsuri
Saket

Utilizați Data pentru a obține componenta Date a instanței DateTime:

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

Cu această abordare, proprietatea Date va returna data de la miezul nopții. Astfel, partea de timp va fi 00:00:00 în acest caz.

Există câteva modalități alternative de a obține doar partea Date, dar tipul de returnare va fi un șir de caractere:

1.) var date=DateTime.Now.ToString("dd/MM/yyyy"); //Can also use .ToString("dd-MM-yyyy");

2.) var dateOnlyString = dateTimeNow.ToShortDateString(); //Return 00/00/0000

Referință: aici.

Comentarii

  • De asemenea, returnează 3/11/2014 12:00:00 AM ceea ce OP nu dorește. El vrea un DateTime fără o componentă de timp. –  > Por Tim Schmelter.
  • Desigur, dar ar trebui să menționați acest lucru în răspunsul dumneavoastră. Date nu este răspunsul la întrebarea lui OP (el chiar a folosit Convert.ToDateTime(StartDate).Date). –  > Por Tim Schmelter.
  • El a folosit deja Date așa că un răspuns care îi cere pur și simplu să folosească proprietatea Date proprietate este inutil. –  > Por Jeppe Stig Nielsen.
Ralph De Guzman

încercați acest lucru:string x = DateTime.Now.ToShortDateString().

acest lucru va obține data dd/mm/yy dată la șirul x.

Comentarii

  • Acest lucru face exact ceea ce caut. Mulțumesc. –  > Por nu știu nimic.
  • Nu pare să existe în xamarin forms. Deși pe msdn este sugerat sub system namespace. –  > Por Emil.
Kjartan

Cred că întrebarea ta este oarecum… discutabilă.

Cereți o dată fără o oră, dar primiți un răspuns. DateTimecare le are pe amândouă. Totuși, nu cred că ar trebui să fie o problemă în majoritatea cazurilor:

Dacă creați un DateTime cu o anumită dată și o comparați cu o altă dată, iar ambele au ora setată la miezul nopții, comparațiile vor fi valide și corecte. De ex:

var yesterday = new DateTime(2014, 3, 10);
var today = new DateTime(2014, 3, 11);
var tomorrow = new DateTime(2014, 3, 12);

Compararea și sortarea acestora va funcționa așa cum vă așteptați, la fel și următoarele:

if(today == DateTime.Today){
    Console.WriteLine("Today is the day!");
}

Cu alte cuvinte, ar trebui să fie perfect în regulă doar să vă prefaceți că partea de timp nu există.

De asemenea, după cum ați menționat în OP, puteți utiliza proprietatea Date dacă doriți să vă asigurați că evitați orice componentă temporală:

// Note the addition of hours, minutes and seconds:
var today = new DateTime(2014, 3, 11, 14, 35, 33); 

if(today == DateTime.Today){
    Console.WriteLine("This never happened...");    
}

if(today.Date == DateTime.Today){
    Console.WriteLine("...But today is still the day!");    
}

Jeppe Stig Nielsen

A DateTime are atât o dată, cât și o oră. Puteți decide singur că într-o anumită proprietate nu veți folosi niciodată partea de dată. Aceasta va fi doar 12:00 AM, dar nu o veți folosi.

În anumite situații poate fi util să vă scrieți propriul tip care nu poate conține niciodată o componentă de oră. Iată un început:

struct Date : IFormattable
{
    readonly DateTime value;
    public Date(DateTime dateAndTime)
    {
        value = dateAndTime.Date;
    }

    public string ToString(string format, IFormatProvider formatProvider)
    {
        return value.ToString(format ?? "d", formatProvider);
    }
    public string ToString(string format)
    {
        return ToString(format, null);
    }
    public string ToString(IFormatProvider formatProvider)
    {
        return ToString(null, formatProvider);
    }
    public override string ToString()
    {
        return ToString(null, null);
    }

    public static implicit operator DateTime(Date date)
    {
        return date.value;
    }
}

Câmpul value conține componenta 12 AM, dar este private și nu se vede din exterior. Supraîncărcările de ToString() se asigură că, dacă nu se solicită altceva, câmpul Date este scris cu formatul de dată scurt al culturii curente.

Tags: