Data vs DateTime


110

Estou trabalhando em um programa que exige que a data de um evento seja retornada.

Estou procurando um Date, não um DateTime.

Existe um tipo de dados que retorna apenas a data?

Respostas:


131

Não, não há. DateTimerepresenta algum ponto no tempo que é composto por uma data e uma hora. No entanto, você pode recuperar a parte da data por meio da Datepropriedade (que é outra DateTimecom a hora definida como 00:00:00).

E você pode recuperar propriedades de data individuais por meio de Day, Monthe Year.


23

Eu criei uma estrutura de data simples para momentos em que você precisa de uma data simples sem se preocupar com a parte do tempo, fusos horários, local vs. utc, etc.

Date today = Date.Today;
Date yesterday = Date.Today.AddDays(-1);
Date independenceDay = Date.Parse("2013-07-04");

independenceDay.ToLongString();    // "Thursday, July 4, 2013"
independenceDay.ToShortString();   // "7/4/2013"
independenceDay.ToString();        // "7/4/2013"
independenceDay.ToString("s");     // "2013-07-04"
int july = independenceDay.Month;  // 7

https://github.com/claycephus/csharp-date


2
Obrigado! Isso é útil.
garfbradaz

16

Infelizmente, não no .Net BCL. As datas são geralmente representadas como um objeto DateTime com a hora definida para meia-noite.

Como você pode imaginar, isso significa que você tem todos os problemas de fuso horário associados, embora para um objeto Date você não queira absolutamente nenhum tratamento de fuso horário.


1
Se você estiver usando um valor DateTime como uma data, defina o tipo como UTC. Nenhum ajuste de fuso horário para lidar. DateTime date = DateTime.SpecifyKind (DateTime.Today, DateTimeKind, Utc);
Suncat2000

Sim, posso falar por experiência própria que usar datepara qualquer coisa é uma má ideia, a menos que você tenha 100% de certeza de que seu aplicativo funcionará apenas em um fuso horário. Salvar tudo como datetimeoferece o melhor dos dois mundos, incluindo o mais crítico, uma maneira fácil de evitar pesadelos de fuso horário se as configurações de fuso horário do seu servidor mudarem ... e começar a gravar dados de maneiras que você não esperava. Datetimepode salvá-lo lá, datenão pode mesmo, e será extremamente difícil de consertar se você começar a escrever datecom o contexto de fuso horário errado.
Kelsey Hannan

2
@KelseyHannan, a menos, é claro, que você esteja lidando com coisas como "data de nascimento" ou "data de compra", onde explicitamente não quer que as coisas mudem misteriosamente de dias só porque você mudou de país. Como, digamos, o processamento de pedidos de hipotecas irlandesas na Nova Zelândia como um exemplo não aleatório.
Roger Willcocks

9

Crie uma classe de wrapper. Algo assim:

public class Date:IEquatable<Date>,IEquatable<DateTime>
    {
        public Date(DateTime date)
        {
            value = date.Date;
        }

        public bool Equals(Date other)
        {
            return other != null && value.Equals(other.value);
        }

        public bool Equals(DateTime other)
        {
            return value.Equals(other);
        }

        public override string ToString()
        {
            return value.ToString();
        }
        public static implicit operator DateTime(Date date)
        {
            return date.value;
        }
        public static explicit operator Date(DateTime dateTime)
        {
            return new Date(dateTime);
        }

        private DateTime value;
    }

E exponha o que valuevocê quiser.


4
Sugiro que seu construtor defina DateTime.Kind como DateTimeKind.Unspecifiedpara que, quando serializado, seja desserializado sem conversão (pode alterar a data com base em diferentes fusos horários).
oatsoda

1
@OffHeGoes Defina DateTime.Kind como DateTimeKind.Utc. Não defina como DateTimeKind.Unspecifiedporque isso garantirá que será serializado / desserializado com um deslocamento de fuso horário incluído! A data do calendário é a mesma, independentemente do fuso horário, portanto, não deixe o sistema ajustá-la.
Suncat2000


4

DateTime tem uma propriedade Date que você pode usar para isolar a parte da data. O método ToString também faz um bom trabalho em exibir apenas a parte da data quando a parte da hora está vazia.


3

O objeto DateTime tem uma propriedade que retorna apenas a parte da data do valor.

    public static void Main()
{
    System.DateTime _Now = DateAndTime.Now;
    Console.WriteLine("The Date and Time is " + _Now);
    //will return the date and time
    Console.WriteLine("The Date Only is " + _Now.Date);
    //will return only the date
    Console.Write("Press any key to continue . . . ");
    Console.ReadKey(true);
}

Esta resposta está incorreta. A data retorna a DateTimecom a hora definida para 0:00:00
Serj Sagan

3

Não há DateDataType.

No entanto, você pode usar DateTime.Datepara obter apenas a data.

POR EXEMPLO

DateTime date = DateTime.Now.Date;

Existe uma estrutura Date, e os objetos podem ser declarados do tipo Date.
Kaleb Anderson

@KalebAnderson não está na implementação padrão do .NET, não existe. Se você está falando sobre o VB.net Date, ainda é um DateTime.
Nick N.

DateTime.Now.Dateé o mesmo que DateTime.Today. Existe um DateTime.UtcNowque retorna o valor de data e hora como hora universal (UTC), mas não há nenhum método ou propriedade UTC equivalente para Hoje; DateTimeKind.UtcNow.Dateé a expressão apropriada.
Suncat2000

2

Você pode retornar DateTime onde a parte da hora é 00:00:00 e simplesmente ignorá-la. As datas são tratadas como inteiros de carimbo de data / hora, portanto, faz sentido combinar a data com a hora, pois isso está presente no inteiro de qualquer maneira.


2

Para isso, você precisa usar a data, mas ignorar o valor da hora.

Normalmente, uma data seria um DateTime com hora de 00:00:00

O DateTimetipo tem uma .Datepropriedade que retorna o DateTimecom o valor de tempo definido como acima.


1
public class AsOfdates
{
    public string DisplayDate { get; set; }
    private DateTime TheDate;
    public DateTime DateValue 
    {
        get 
        { 
            return TheDate.Date; 
        } 

        set 
        { 
            TheDate = value; 
        } 
    }    
}

4
Seria útil dar uma explicação para sua resposta.
Guanxi

0

Você pode tentar um dos seguintes:

DateTime.Now.ToLongDateString();
DateTime.Now.ToShortDateString();

Mas não há nenhum tipo "Data" no BCL.

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.