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?

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.


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


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.


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.


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


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.


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

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;

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.


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.


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

        set 
        { 
            TheDate = value; 
        } 
    }    
}

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.