Como remover parte do tempo da data em C # apenas no objeto DateTime?


458

Preciso remover parte da hora da data ou hora ou provavelmente ter a data no seguinte formato, no objectformato não no formato destring .

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

Não posso usar nenhum string método de conversão, pois preciso da data no objectformulário.

Tentei primeiro converter a DateTimepara a string, remova a data específica da hora, mas ela adiciona 12:00:00 AMassim que eu a converto DateTime objectnovamente.


10
Não há classe / estrutura somente para data no C #. Se você quiser ter um, precisará adicionar sua própria classe / estrutura.
Oleschri 25/05

12
Simplesmente use DateTime.Now.ToShortDateString ()
Mohammad Shahnawaz Alam

@ShahnawazAalam eu acredito que ainda é uma string, também tenho problemas com datetime. precisa apenas de data da variável datetime

Veja também esta resposta que descreve alternativas.
Matt Johnson-Pint

var dateTime = DateTime.Now.Date;
precisa saber é o seguinte

Respostas:


826

Use a propriedade Date :

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

A datevariável conterá a data, a parte da hora será 00:00:00.


36
A parte do horário não seria 12:00:00, conforme mencionado pelo questionador?
FIre Panda

13
A parte da hora é zero (meia-noite). Quando isso é formatado como uma sequência usando o formato AM / PM, é representado como 12 horas.
Driis 25/05

98
Isso não responde à pergunta. Como a resposta sugere, DateTime.Date (que é um DateTime!) Tem uma parte do tempo padrão como 00:00:00. O aswer deve ser: com DateTime, você não pode. Construa sua própria estrutura ou dê uma olhada no Noda Time.
Tomas Vinter

23
@TomasVinter está correto. Não existe uma estrutura "estritamente de data" na estrutura do .NET. Você terá que criar o seu próprio. No entanto, DateTime expõe o método .ToShortDateTime (), que formatará uma sequência que representa apenas a parte da data do valor e formatará a data usando o DateFormat configurado na cultura atual (Thread.Current.CurrentCulture), portanto, MM-dd -aaaaa para os EUA, dd-MMM-aaaa na UE, etc. #
Michael J. Heier

16
Para aqueles que dizem que esta não é a resposta correta: a resposta está correta, mas a pergunta está errada. Ele mostra a ignorância do questionador sobre o assunto. Não há formato para a data em formato de objeto. O formato é significativo apenas quando é convertido em uma string. O que é realmente armazenado em seu objeto não é 06/26/2009 00:00:00.000, mas 63381571200000000, que é o número de DateTime.MinValuemarcações (1/100000000 de segundo) desde (01/01/0001). Se você deseja exibir a data, converta-a em uma sequência, caso contrário, ela possui um componente de hora da meia-noite. Lide com isso.
CptRobby

165

Você pode usar seqüências de caracteres de formato para dar à sequência de saída o formato desejado.

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

Leia mais sobre seqüências de caracteres de formato de data e hora personalizadas .


48
DateAndTime.ToShortDateString ();
John Peters

Eu precisava disso, mas costumava CultureInfo.DateTimeFormat.ShortDatePatternser amigável ao usuário
Dzmitry Lahoda 12/12

Isso fornecerá a saída incorreta nas localidades que não usam este formato. Melhor usar ToShortDateString que está ciente locale
Matt Wilko

1
Atualize o formato dd/MM/yyyypara o que deseja antes de usá-lo!
precisa saber é o seguinte

.ToString()com o formato desejado é exatamente o que eu precisava, obrigado!
Willem Ellis


39

Dê uma olhada na propriedade DateTime.Date .

Obtém o componente de data desta instância.


20
você deve explicar mais, isso não é uma resposta este é um link
Malaquias

27
@ Malachi: Eu copiei e colei a primeira linha da API oficial vinculada, caso as pessoas não entendam os hiperlinks.
Nick

var dateTime = DateTime.Now.Date;
precisa saber é o seguinte

29

A Datepropriedade retornará a data à meia-noite.

Uma opção poderia ser obter os valores individuais (dia / mês / ano) separadamente e armazená-los do tipo desejado.

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

Nenhuma das respostas acima resolveu meu problema nos winforms.

a maneira mais fácil de alcançar SOMENTE a data é a função simples no Datetime:

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

Você só terá data na sequência de aniversários.


4
Por que existe um (string)elenco? O tipo retornado por ToShortDateStringé realmente uma string.
Askolein 29/07

15

Tente fazer sua própria estrutura para isso. O objeto DateTime terá data e hora, ambos


3
Essa deve ser a resposta. Parece ser a única resposta para a pergunta real - o tempo não pode ser removido do objeto. Crie seu próprio, viva à meia-noite (ou hora do dia) ou trabalhe com uma representação do ToString do que você deseja.
Phil Cooper

Essa pode ser a resposta mais correta, mas também é completamente acadêmica para todos, exceto aqueles sem vida, que gostam de reinventar uma roda que gira muito bem por si própria. Se estamos realmente preocupados com a memória adicionada usada para armazenar uma propriedade longa adicional com nossa estrutura DateTime, temos problemas maiores do que simplesmente ignorá-la.
IGanja

Obrigado pela resposta. Sem criar uma estrutura, o usuário pode usar uma variável de cadeia na maioria dos casos. O que você acha?
Kushan Randima

@KushanRandima, isso é verdade na maioria dos casos. No entanto, na pergunta que o usuário não deseja no formato de string, sugeri isso como uma das alternativas.
Umesh CHILAKA

15

Você não pode. Um DateTime no .NET sempre tem um horário, por padrão 00: 00: 00: 000. A propriedade Date de um DateTime também é um DateTime (!), Portanto, também possui um horário padrão 00: 00: 00: 000.

Isso é uma falta no .NET Framework e pode-se argumentar que o DateTime no .NET viola o Princípio de Responsabilidade Única .


Esta é a resposta correta para esta pergunta. Os objetos DateTime sempre terão Time.
Drkawashima

1
Por interesse, por que você consideraria isso uma violação do SRP? Se você considerar que a responsabilidade está representando um ponto no tempo e a classe expuser a propriedade Ticks subjacente, as propriedades Year / Hour / Millisecond estarão disponíveis apenas para lidar com a convenção (convencional).
Rob Church

Como data e hora são dois conceitos diferentes, infelizmente no .NET Framework agrupado na mesma estrutura. Portanto, a estrutura tem mais de uma responsabilidade (manipulando data e hora) e, portanto, viola o SRP. O DateTime no .NET não representa apenas um ponto no tempo, mas muitas outras coisas também. Portanto, considerando que é responsabilidade representar apenas um ponto no tempo, seria estranho.
Tomas Vinter

2
um ponto no tempo, é representado por data e hora. Se você disser a alguém para encontrá-lo às 13h, está assumindo que a pessoa sabe em que dia. Mesmo que hoje seja o dia, a precisão determina que seja explicitamente declarado. Portanto, um único valor representando um ponto no tempo com qualquer precisão DEVE incluir a data e a hora usando um ponto de partida de referência. Portanto, data, de uma referência inicial e hora, de uma referência inicial, são claramente o mesmo conceito; tempo adicionando precisão adicional.
IGanja

1
Somente o tempo é útil quando você está falando sobre várias instâncias: por exemplo, todos os dias à meia-noite UTC; no primeiro dia de cada mês ao meio-dia, horário local; etc. Indiscutivelmente, o TimeSpan pode ser usado para representar isso por convenção, mas pode ser mais limpo ter um objeto Time que represente um ponto dentro de um período de 24 horas e um fuso horário. Por fim, existem três idéias que o DateTime contém: Data, Hora e Fuso Horário.
David Beckman

12

DateTime.Date

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

9
você deveria explicar mais. isso não é uma resposta, é um link
Malaquias

2
var newDate = DateTime.Now; A propriedade //newDate.Date é parte da data de DateTime. O que não está claro? Se não estiver claro - siga o link.
VikciaR

10

Aqui está outro método usandoString.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);

Resultado:

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

Date Only : 04/09/2016

Isso também funciona se a Data e Hora estiver armazenada no banco de dados.

Para obter mais formatação de data e hora, verifique estes links:

Referência 1

Referência 2

A esperança ajuda.


O OP declara explicitamente "Não posso usar nenhum método de conversão de cadeia, pois preciso da data no formato de objeto".
ChrisF

7

Desta forma, obter apenas um encontro sem tempo

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

Saída = 16/5/2015


1
Por favor, considere que vale a pena adicionar uma resposta tardia (e do ponto de vista positivo de outros usuários), apenas se for distintamente diferente de outras respostas. O que não é um caso aqui.
Mkcekiera

5

Eu escrevi uma DateOnlyestrutura. Isso usa um DateTime sob a capa, mas nenhuma parte do tempo é exposta publicamente:

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

Isso é convertido do VB.NET, portanto, desculpe se algumas conversões não forem 100%


5

Use date.ToShortDateString () para obter a data sem o componente de hora

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

use date.ToString () para personalizar o formato da data

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

4

Estou surpreso que ninguém tenha mencionado DateTime.

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

Consulte MSDN


+1 somente porque sua resposta produz uma data com as propriedades corretas; no entanto, o OP deseja remover a hora de uma data existente e não criar uma nova data.
IGanja

3

Você pode tentar isso pela única data da data e hora

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

Onde dt é o DateTime


3

Me deparei com este post ao tentar resolver o Q original.

Estou usando o Asp.Net e, depois de algumas pesquisas que descobri quando você está vinculando o valor da data no código por trás, você pode diminuir o tempo para que ele não seja exibido na tela.

C #:

DateTime Today = DateTime.Now;

aspx:

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

3

usar

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

3

Se você estiver convertendo em string, poderá fazê-lo facilmente dessa maneira.

Estou tendo data como seu objeto DateTime.

date.ToString("d");

Isso lhe dará apenas a data.


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

Se você tirar uma data do calendário, com isso também teremos tempo. O que não é obrigatório o tempo todo. Usando isso, podemos remover a hora da data.


2

na minha experiência, nenhuma das soluções mencionadas funcionou, talvez porque eu quisesse remover o tempo da data extraída do banco de dados, mas o código abaixo funcionou bem:

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

A pergunta afirmou especificamente que a data precisava ser um objeto, não uma string. Esta solução retorna uma string.
saluce

2

Declare a variável como uma sequência.

exemplo:

public string dateOfBirth ;

depois atribua um valor como:

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

as pessoas devem ler a pergunta e parar de converter estruturas (na pilha) em objetos (na pilha) sem motivo.
iGanja 28/02

2

Sei que este é um post antigo com muitas respostas, mas não vi essa maneira de remover a parte do tempo. Suponha que você tenha uma DateTimevariável chamada myDate, com a data com parte do tempo. Você pode criar um novo DateTimeobjeto a partir dele, sem a parte do tempo, usando este construtor:

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

Como isso:

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

Dessa forma, você cria um novo DateTimeobjeto com base no antigo, com 00:00:00 como parte do tempo.


2

Crie uma estrutura que mantenha apenas as propriedades que você deseja. Em seguida, um método de extensão para obter facilmente essa estrutura a partir de uma instância de 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
        };
    }
}

Uso

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

2

Para obter apenas a parte da data, use o método ToString (),

exemplo: DateTime.Now.Date.ToString ("dd / MM / aaaa")

Nota: O mm no formato dd / MM / aaaa deve ser maiúsculo


1

Use .Date de um objeto DateTime ignorará a parte da hora.

Aqui está o código:

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

Resultado:

>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

Use um pouco de RegEx:

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

Produz uma data no formato: dd / mm / aaaa


1

Para uso por datalist, repetidor .. na página aspx: <% # Eval ("YourDateString"). ToString (). Remove (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

Isso pode ser feito simplesmente desta maneira:

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

1

Este código fornece uma visão clara da escrita Date, bem como Timeseparadamente

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

Espero que isto ajude.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.