Fecha vs Fecha y hora

110

Estoy trabajando en un programa que requiere que se devuelva la fecha de un evento.

Estoy buscando un Date, no un DateTime.

¿Existe un tipo de datos que devuelva solo la fecha?

MrM
fuente

Respuestas:

131

No, no lo hay. DateTimerepresenta algún punto en el tiempo que se compone de una fecha y una hora. Sin embargo, puede recuperar la parte de la fecha a través de la Datepropiedad (que es otra DateTimecon la hora establecida en 00:00:00).

Y puede recuperar propiedades de fecha individuales mediante Day, Monthy Year.

Ronald Wildenberg
fuente
23

Creé una estructura de fecha simple para los momentos en que necesita una fecha simple sin preocuparse por la porción de tiempo, las zonas horarias, local frente a 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

Arcilla
fuente
2
¡Gracias! Eso es útil.
garfbradaz
16

Desafortunadamente, no en .Net BCL. Las fechas generalmente se representan como un objeto DateTime con la hora establecida en medianoche.

Como puede adivinar, esto significa que tiene todos los problemas relacionados con la zona horaria, aunque para un objeto Date no querría absolutamente ningún manejo de la zona horaria.

Jonathan Rupp
fuente
1
Si está utilizando un valor de fecha y hora como fecha, establezca el tipo en UTC. No hay ajustes de zona horaria con los que lidiar. DateTime date = DateTime.SpecifyKind (DateTime.Today, DateTimeKind, Utc);
Suncat2000
Sí, puedo decir por experiencia que usar datepara cualquier cosa es una mala idea a menos que esté 100% seguro de que su aplicación solo funcionará en una zona horaria. Guardar todo como datetimele brinda lo mejor de ambos mundos, incluido el más crítico, una manera fácil de evitar las pesadillas de la zona horaria si la configuración de la zona horaria de su servidor alguna vez cambia ... y comienza a escribir datos de maneras que no anticipaba. Datetimepuede salvarlo allí, dateno puede en absoluto, y será increíblemente difícil de arreglar si alguna vez comienza a escribir datecon el contexto de zona horaria equivocado.
Kelsey Hannan
2
@KelseyHannan, a menos que, por supuesto, estés lidiando con cosas como "fecha de nacimiento" o "fecha de compra", donde explícitamente no quieres que las cosas cambien misteriosamente de día solo porque te mudaste de país. Por ejemplo, procesar solicitudes de hipotecas irlandesas en Nueva Zelanda como un ejemplo no aleatorio.
Roger Willcocks
9

Crea una clase contenedora. Algo como esto:

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

Y exponga lo valueque quiera.

Øyvind Skaar
fuente
4
Sugeriría que su constructor debería configurar DateTime.Kind para DateTimeKind.Unspecifiedque cuando se serialice se deserialice sin convertir (puede cambiar la fecha en función de diferentes zonas horarias).
Oatsoda
1
@OffHeGoes Establece el DateTime.Kind en DateTimeKind.Utc. ¡No lo configure DateTimeKind.Unspecifiedporque eso garantizará que se serialice / deserialice con una compensación de zona horaria incluida! Una fecha del calendario es la misma independientemente de la zona horaria, así que no permita que el sistema la ajuste.
Suncat2000
5

El tipo de fecha es solo un alias del tipo de fecha y hora utilizado por VB.NET (como int se convierte en Integer). Ambos tipos tienen una propiedad Date que le devuelve el objeto con la parte de tiempo establecida en 00:00:00.

stevehipwell
fuente
1
Cierto. La página de documentos de MSDN para VB.NET El tipo de fecha dice: El tipo correspondiente en .NET Framework es la estructura System.DateTime .
miroxlav
4

DateTime tiene una propiedad Date que puede usar para aislar la parte de la fecha. El método ToString también hace un buen trabajo al mostrar solo la parte de fecha cuando la parte de tiempo está vacía.

Cruzar
fuente
3

El objeto DateTime tiene una propiedad que devuelve solo la parte de fecha del 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);
}
hmcclungiii
fuente
Esta respuesta es incorrecta. La fecha devuelve un DateTimecon la hora establecida en 0:00:00
Serj Sagan
3

No hay ningún tipo de Datedatos.

Sin embargo, puede usar DateTime.Datepara obtener solo la fecha.

P.EJ

DateTime date = DateTime.Now.Date;
Nick N.
fuente
Hay una estructura de fecha y los objetos se pueden declarar como tipo Fecha.
Kaleb Anderson
@KalebAnderson no está en la implementación predeterminada .NET, no lo hay. Si está hablando de la fecha de VB.net, sigue siendo una fecha y hora.
Nick N.
DateTime.Now.Datees lo mismo que DateTime.Today. Hay un DateTime.UtcNowque devuelve el valor de fecha y hora como hora universal (UTC), pero no hay un método o propiedad equivalente a UTC para Hoy; DateTimeKind.UtcNow.Datees la expresión apropiada.
Suncat2000
2

Puede devolver DateTime donde la parte de la hora es 00:00:00 y simplemente ignorarla. Las fechas se manejan como números enteros de marca de tiempo, por lo que tiene sentido combinar la fecha con la hora, ya que de todos modos está presente en el número entero.

Mikko Rantanen
fuente
2

Para esto, debe usar la fecha, pero ignore el valor de la hora.

Normalmente, una fecha sería una fecha y hora con la hora de 00:00:00

El DateTimetipo tiene una .Datepropiedad que devuelve el DateTimecon el valor de tiempo establecido como arriba.

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

        set 
        { 
            TheDate = value; 
        } 
    }    
}
Guillermo Mendoza
fuente
4
Sería útil dar alguna explicación a su respuesta.
Guanxi
0

Puede probar uno de los siguientes:

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

Pero no hay un tipo de "Fecha" en la BCL.

Andrew Hare
fuente